Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas Fernando

Calendario x banco de dados

Recommended Posts

Ola pessoal boa tarde,

 

Não sei se vou saber explicar corretamente.

 

Estou desenvolvendo um sistema de apontamento de horas, já tenho alguns tópicos abertos sobre o assunto, até agora consegui fazer tudo, o que eu tinha duvida o pessoal me ajudava.

 

Bem o sistema funciona basicamente da seguinte forma, usuário comum aponta suas horas e os gerentes aprovam.

 

Porem o gerente quer saber quem não está apontando horas, tudo isso de uma forma dinâmica na qual ja apareça na tela.

 

É justamente ai que não estou sabendo o que fazer.

 

Me ajudem ai, eu precisaria ter um calendário dentro do sistema que comparasse informações cadastradas do apontamento que é a tabela time_data.

 

a tabela time_data possui vários campos entre eles o user_id e o data_date.

 

Só não estou imaginando como eu posso comprar essas informações do banco com um calendário.

 

Bem é isso se alguém tiver alguma ideia ajuda muito.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Lucas!

 

Não sei se entendi, mas vamos lá

 

vc quer comparar uma hora colocada por um usuário com uma hora previamente cadastrada, certo?

 

bem, se for isso, basta apenas colocar as datas aprovadas(sim, essas vc cadastra no banco) e fazer um array ou um loop direto no BD para ver se tal hora tá adequada. exemplo:

 

// consulta ao banco com o horário solicitado

// horários cadastrados no BD: 11:00, 12:00, 13:00, 14:00, 15:00, 16:00

//código que vai varrer o bd para ver se o horário solicitado tá disponível, vamos lá

$ve_horario = "select * from tbl_hora where cmpo_hora = '".$hora."' and sta_hora = 'disponivel'";
$exec_hora = mysql_query($ve_horario);

//verifica se tal hora tá disponível

if(mysql_num_rows($exec_hora)>0){
  echo "disponível";
}else{
  echo "tente outro horário";
}

vamos a algumas considerações:

 

a dinâmica desse código é fazer um select, e neste, verificar se determinado horário está disponível. Note-se que coloquei horário pré cadastrados em outra tabela, exemplo: tbl_horário, e que essa query vai verificar, através de um status "disponível", e retornar maior que zero, um, caso esteja disponível e zero, se estiver indisponível.

 

Se não tiver de acordo dê um grito

 

espero ter ajudado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola GCAS, na verdade é algo um pouco diferente.

 

O que eu preciso fazer na verdade é uma forma do gerente saber quem não apontou as horas em determinada data.

 

Só que dessa forma como o usuário ainda não apontou eu não tenho como comparar com dados que ainda não existem no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem se for assim...

 

pode usar na query a data desejada e também selecionar os que tiver null no campo hora. Ex:

 

$ve_horario = "select * from tbl_hora where cmpo_hora is null and data = '".$data."'";
$exec_hora = mysql_query($ve_horario);

tipo os parametros são hora (null) e data( que o gerente escolher)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então mais acho que dessa forma não vai dar certo, porque nesse casos esses campos ainda não existem.

Porque cada nova hora apontada o usuário cria uma nova linha na tabela time_data, mais não tem como eu comparar se ele ainda não cadastrou nada no dia 23/01/2014 por exemplo.

 

Está certa minha logica ou estou pensando errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gcas segue minhas tabelas.

 


--
-- Estrutura da tabela `time_data` - Horas apontadas
--

CREATE TABLE IF NOT EXISTS `time_data` (
  `time_id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL DEFAULT '0',
  `function_fk` int(10) NOT NULL,
  `data_date` date DEFAULT NULL,
  `type_id` int(10) NOT NULL DEFAULT '0',
  `work_id_fk` int(10) NOT NULL,
  `hours` double DEFAULT NULL,
  `notes` text,
  `user_appro_fk` int(10) DEFAULT NULL,
  `status_appro` char(1) NOT NULL,
  PRIMARY KEY (`time_id`),
  KEY `user_id` (`user_id`),
  KEY `type_id` (`type_id`),
  KEY `work_id_fk` (`work_id_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;


-- --------------------------------------------------------

--
-- Estrutura da tabela `time_types` - Projetos
--

CREATE TABLE IF NOT EXISTS `time_types` (
  `type_id` int(10) NOT NULL AUTO_INCREMENT,
  `description` varchar(100) NOT NULL DEFAULT '',
  `status` char(1) NOT NULL,
  PRIMARY KEY (`type_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=100001 ;

--


-- --------------------------------------------------------

--
-- Estrutura da tabela `time_work` - Tipo de hora
--

CREATE TABLE IF NOT EXISTS `time_work` (
  `work_id` int(10) NOT NULL AUTO_INCREMENT,
  `work_name` char(2) NOT NULL DEFAULT '',
  `work_desc` varchar(15) NOT NULL DEFAULT '',
  PRIMARY KEY (`work_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;




-- --------------------------------------------------------

--
-- Estrutura da tabela `user_department` - Departamento
--

CREATE TABLE IF NOT EXISTS `user_department` (
  `dpt_id` int(10) NOT NULL AUTO_INCREMENT,
  `dpt_descri` varchar(100) NOT NULL,
  `dpt_status` char(1) NOT NULL,
  PRIMARY KEY (`dpt_id`),
  UNIQUE KEY `dpt_descri` (`dpt_descri`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;



-- --------------------------------------------------------

--
-- Estrutura da tabela `user_functions` - Funções
--

CREATE TABLE IF NOT EXISTS `user_functions` (
  `function_id` int(10) NOT NULL AUTO_INCREMENT,
  `function_desc` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`function_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;



-- --------------------------------------------------------

--
-- Estrutura da tabela `user_info` - Usuários
--

CREATE TABLE IF NOT EXISTS `user_info` (
  `user_id` int(10) NOT NULL AUTO_INCREMENT,
  `fname` varchar(50) DEFAULT NULL,
  `lname` varchar(50) DEFAULT NULL,
  `function_id_fk` int(10) NOT NULL DEFAULT '0',
  `dpt_id_fk` int(10) NOT NULL,
  `level` varchar(20) NOT NULL DEFAULT 'User',
  `username` varchar(30) NOT NULL DEFAULT '',
  `password` varchar(40) NOT NULL DEFAULT '',
  PRIMARY KEY (`user_id`),
  KEY `function_id_fk` (`function_id_fk`),
  KEY `function_id_fk_2` (`function_id_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;


-- --------------------------------------------------------

--
-- Estrutura da tabela `user_log`
--

CREATE TABLE IF NOT EXISTS `user_log` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL,
  `loginip` varchar(25) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `lastlogin` date NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá lucas td?

 

primeiramente, desculpe-me pela demora. Bem vamos ao caso.

 

Conforme código da tabela time_data, descrito abaixo e da seguinte premissa "quem não apontou as horas em determinada data."

 

CREATE TABLE IF NOT EXISTS `time_data` (
  `time_id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL DEFAULT '0',
  `function_fk` int(10) NOT NULL,
  `data_date` date DEFAULT NULL,
  `type_id` int(10) NOT NULL DEFAULT '0',
  `work_id_fk` int(10) NOT NULL,
  `hours` double DEFAULT NULL,
  `notes` text,
  `user_appro_fk` int(10) DEFAULT NULL,
  `status_appro` char(1) NOT NULL,
  PRIMARY KEY (`time_id`),
  KEY `user_id` (`user_id`),
  KEY `type_id` (`type_id`),
  KEY `work_id_fk` (`work_id_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

 

vamos à solução. É simples, apenas é só puxar, no where, a data (coluna "data_date") - de acordo com a data desejada, e se a coluna 'hours' está em branco. vou mostrar (forma bem simploria)

 

select * from time_data where data_date = '2013-01-01' and hours is null

 

Essa query quer dizer: puxar todos os registros na data selecionada e vai mostrar apenas os registros que estiverem com a coluna "hours" em branco (entende-se que não foi colocada hora alguma).

 

 

Qualquer coisa de um grito :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai GECAS, então só que ai que ta o problema .

 

Não tem como o usuario apontar uma hora em branco ou ele aponta ou não aponta, ou seja, se ele não apontou as horas do dia 29/01/2014 esses dados ainda não existirão na tabela time_data

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então lucas, o campo hours é onde fica armazenado a hora que o usuário aponta certo?!

 

então, já que não tá setado como not null, logo se essa linha for criada sem a hora, esta ficará em branco, logo servindo de parâmetro (null).

 

se for o caso, a coluna hours não setar o horáro, crie uma coluna na tabela que indique o horário, se tiver preenchida, foi, se não, usa isso como parametro. Sacou?! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

GCAS só precisei utilizar LEFT JOIN fiz assim:

 

select usr.user_id, usr.fname, usr.lname, usr.level,
dat.user_id, dat.data_date, DATE('2013-10-17') as data
from user_info usr left join time_data dat 
on data_date = '2013-10-17'
and usr.user_id = dat.user_id
where usr.level <> 'Super Admin'
and dat.data_date is null
group by usr.user_id, dat.data_date
order by fname asc

Dessa forma ele traz todos os funcionarios que não apontaram horas no dia.

 

Porem como te disse eu quero fazer uma faixa, precisamente do inicio ao termino do mes dessa forma to bolando algo assim em php:

 

<?php
	
	date_default_timezone_set('UTC');
 
	// data de inicio = inicio do mes atual
	$date = date('Y-m-01');
	// data final = data atual
	$end_date = date('Y-m-d');
 
	while (strtotime($date) <= strtotime($end_date)) {
		echo $date."<br>";
		$date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
	}
 
?>

Porem ainda não sei muito bem como vou ligar o select, vou ver melhor isso ainda.

 

Mais ainda tem um probleminha que são os finais de semana e feriados. Feriado ate que não tem problema, mais o final de semana q eu to pensando como fazer.

 

 

já que minha ideia é deixar uma especie de "feed de pendencias" não fica legal o cara ficar recebendo uma mensagem de um final de semana.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal vejam como está ficando.


<?php
    /*$hoje = time();
    $amanha = $hoje + (24*3600);
    echo "<br />" . date('d/m/Y',$hoje);
    echo "<br />" . date('d/m/Y',$ontem);
    echo "<br />" . date('d/m/Y',$amanha); */



	include('db.php');
	include("biblio.fcn");
	// Set timezone
	date_default_timezone_set('UTC');
 
	// data de inicio = inicio do mes atual
	$date = date('Y-m-00');
	
    
	// data de ontem dia anterior
	$today           = time();
	$ytrday          = $today - (24*3600);
	$ytrday_result   = date('Y-m-d',$ytrday);
	//echo $ytrday_result;
	
	// data final = data atual
	$end_date = date('Y-m-d');
	
	$n=0;//Marca loops
	while (strtotime($date) <= strtotime($ytrday_result)) {
		$date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
		$resultado[$n] = "select usr.user_id, usr.fname, usr.lname, usr.level,
        dat.user_id, dat.data_date, DATE_FORMAT('$date', '%d/%m/%Y') as data
        from user_info usr left join time_data dat 
        on data_date = '$date'
        and usr.user_id = dat.user_id
        where usr.level <> 'Super Admin'
        and dat.data_date is null
		union ";//faz a busca com os projetos do periodo*/;
		
	  //echo $resultado[$n];
	  $result_final = implode("", $resultado);
	  $n++;
	  
	}
	
//echo $result_final;
 
       @$pag = $_GET['pag'];
    if (isset($pag)){
    $pag = $pag;
	}else{
	$pag = 1;
	}
	
    $quantidade = 10;
	$inicio = ($pag * $quantidade) - $quantidade;
 
 
 
 
 
       $sql = "$result_final
	   select usr.user_id, usr.fname, usr.lname, usr.level,
        dat.user_id, dat.data_date, DATE_FORMAT('$end_date', '%d/%m/%Y') as data
        from user_info usr left join time_data dat 
        on data_date = '$end_date'
        and usr.user_id = dat.user_id
        where usr.level <> 'Super Admin'
        and dat.data_date is null
        group by usr.user_id, dat.data_date
	    order by fname, data asc limit $inicio, $quantidade;";//faz a busca*/
        $dados = mysql_query($sql);
        $linha = 0;
		
       
 
    
 
?>
    <table id="box-table-a"   width="250" border="1" cellpadding="0" cellspacing="0" align="center">
	<tr><th colspan="3" align="center">Não Apontados</th></tr>
	<tr>
	    <th>Nome:</th>
		<th>Data:</th>
    </tr>
	 
<?php
 while($linha < mysql_num_rows($dados)) {
?>
      <tr>
      
	  <td><?php echo mysql_result($dados,$linha,@fname) ?> <?php echo mysql_result($dados,$linha,@lname) ?></td>
	  <td><?php echo mysql_result($dados,$linha,@data) ?></td>
      
      </tr>
    
<?php
  $linha += 1;   
  }
  //mostra paginação apenas se a consulta for igual a "" vazio	
$sql_paginacao = mysql_query("$result_final
	   select usr.user_id, usr.fname, usr.lname, usr.level,
        dat.user_id, dat.data_date, DATE_FORMAT('$end_date', '%d/%m/%Y') as data
        from user_info usr left join time_data dat 
        on data_date = '$end_date'
        and usr.user_id = dat.user_id
        where usr.level <> 'Super Admin'
        and dat.data_date is null
        group by usr.user_id, dat.data_date
	    order by fname, data asc limit $time_entry_display_rows;");
$total_registros = mysql_num_rows($sql_paginacao); // Esta função irá retornar o total de linhas na tabela

$paginas = ceil($total_registros / $quantidade); // Retorna o total de páginas
$links = 2; //limite de numeros de paginação por tela

echo "<br><table border='0' align='center'><tr><td><a href='teste.php?pag=1'>  <   </a></td>"; //Mostra primeira pagina

for($i = $pag-$links; $i <= $pag-1; $i++) { // Gera um loop com o link para as páginas
   if($i<=0){
   }else{
   echo "<td><a href='teste.php?pag=".$i."'>".$i."</a></td>";
   }
}
   echo "<td><a href=#>$pag</a></td>";
   
for($i = $pag+1; $i <= $pag+$links; $i++) { // Gera um loop com o link para as páginas
   if($i>$paginas){
   }else{
   echo "<td><a href='teste.php?pag=".$i." '>".$i."</a></td>";
   }
}  


echo "<td><a href='teste.php?pag=".$paginas."'>  >  </a></td></tr></table>"; // Mostra ultima pagina
?>
</table>

A unica coisa que está faltando é separar pelo menos os sabados e domingos, que não podem aparecer.


Não Apontados
Nome: Data:
Ciclano 01/02/2014
Fulano 02/02/2014
Fulano 03/02/2014

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá! Lucas

 

para o lance do fim de semana, tente

 

select usr.user_id, usr.fname, usr.lname, usr.level,
dat.user_id, dat.data_date, DATE('2013-10-17') as data
from user_info usr left join time_data dat 
on data_date = '2013-10-17'
and usr.user_id = dat.user_id
where usr.level <> 'Super Admin'
and dat.data_date is null and DAYOFWEEK(data_date) <> 7 and DAYOFWEEK(data_date) <> 1
group by usr.user_id, dat.data_date
order by fname asc

Nesse caso o operador "<>"(diferente de) vai tirar os sábados e domingos

 

nesse caso, para mostrar a faixa do início ao fim do mês acho que deveria fazer uma outra query. Tipo, linkando o funcionário e depois fazendo a query com o mês :D

 

Qualquer coisa de um grito

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.