Ir para conteúdo

POWERED BY:

Arquivado

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

Marcos Vinícius

Calendário de férias

Recommended Posts

Pessoal,

 

Eu tô tentando fazer um calendário de férias um pouco diferente. Eu preciso que ele mostre todos os funcionários e um calendário com os dias de férias de cada um marcado em outra cor, pra que dê pra olhar e ver se há muitos funcionários nos mesmos dias em férias.

 

Eu achei um script aqui no fórum e dei uma mexida nele pra ficar no formato que preciso. Com os dias do mês um ao lado do outro e não no formato padrão do calendário. Só que não tenho idéia de como pegar os dias de férias do funcionário e mudar as cores dos dias.

 

O problema é que eu tenho que dizer ao mysql que preciso que ele mude a cor dos dias "entre" as férias.

Assim... o funcionário vai tirar férias do dia 10/01/2014 até 20/01/2014. Então, quero que entre esses dias fique de outra cor.

 

O script tá meio grande pq tem tb o css mas vou postar aqui caso alguém queira copiá-lo e pra ver se alguém tem uma idéia. Imagino que na tabela tenha um campo de início e fim... pra piorar, o funcionário pode dividir as férias em 3 períodos!!!

 

<?php
   
   ########################################
   #											
   #		Calendário de Eventos PHP 5 e MySQL			
   #		Documento: Agenda de Eventos Dinâmica		
   #		Autor: Gaspar Teixeira					
   #		E-mail: gaspar.teixeira@gmail.com			
   #		Data: 14/11/2008						
   #		Direito de Uso: Livre						
   #		Declaração: O autor não se responsabiliza		
   #		pelo utilização deste calendário!					
   #												
   ########################################
   
   ?>
   
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   <title>Agenda de Eventos by Gaspar</title>
   <style type="text/css">
   .tabela{
   background:#fff;
   width:200px;
   padding:0px;
   border:1px solid #f0f0f0;
   float:left;
   margin-right:20px;
   }
   .td{
   background:#f8f8f8;
   width:20px;
   height:20px;
   text-align:center;
   
   }
   .hj{
   background: #FFFFCC;
   width:20px;
   height:20px;
   text-align:center;
   }
   .dom{
   background: #FFCC99;
   width:20px;
   height:20px;
   text-align:center;
   }
   .evt{
   background: #CCFF99;
   width:20px;
   height:20px;
   text-align:center;
   }
   .mes{
   background:#fff;
   width:auto;
   height:20px;
   text-align:center;
   }
   .show{
   background:#202020;
   width:300px;
   height:30px;
   text-align:left;
   font-size:12px;
   font-weight:bold;
   color:#CCFF00;
   padding-left:5px;
   }
   .linha{
   background:#404040;
   width:300px;
   height:20px;
   text-align:left;
   font-size:11px;
   color:#f0f0f0;
   padding:1px 1px 1px 10px;
   }
   .sem{
   background: #ECE6D9;
   width:auto;
   height:20px;
   text-align:center;
   font-size:12px;
   font-weight:bold;
   font-family:Verdana;
   }
   body,td,th {
	   font-family: Verdana;
	   font-size: 11px;
	   color: #000000;
   }
   a:link {
	   color: #000000;
	   text-decoration: none;
   }
   a:visited {
	   text-decoration: none;
	   color: #000000;
   }
   a:hover {
	   text-decoration: underline;
	   color: #FF9900;
   }
   a:active {
	   text-decoration: none;
   }
   </style>
   </head>
   
   <body>
   
   <?php 
   include "sql.php";//conexão com o banco de dados
   
   @mysql_select_db($db);//selecione o banco de dados
   
   if(empty($_GET['data'])){//navegaçao entre os meses
	   $dia = date('d');
	   $month = ltrim(date('m'),"0");
	   $ano = date('Y');
   }else{
	   $data = explode('/',$_GET['data']);//nova data
	   $dia = $data[0];
	   $month = $data[1];
	   $ano = $data[2];
   }
   
   if($month==1){//mês anterior se janeiro mudar valor
	   $mes_ant = 12;
	   $ano_ant = $ano - 1;
   }else{
	   $mes_ant = $month - 1;
	   $ano_ant = $ano;
   }
   
   if($month==12){//proximo mês se dezembro tem que mudar
	   $mes_prox = 1;
	   $ano_prox = $ano + 1;
   }else{
	   $mes_prox = $month + 1;
	   $ano_prox = $ano;
   }
   
   $hoje = date('j');//função importante pego o dia corrente
   switch($month){/*notem duas variaveis para o switch para identificar dia e limitar numero de dias*/
	   case 1: $mes = "JANEIRO";
			   $n = 31;
	   break;
	   case 2: $mes = "FEVEREIRO";// todo ano bixesto fev tem 29 dias
			   $bi = $ano % 4;//anos multiplos de 4 são bixestos
			   if($bi == 0){
				   $n = 29;
			   }else{
				   $n = 28;
			   }
	   break;
	   case 3: $mes = "MARÇO";
			   $n = 31;
	   break;
	   case 4: $mes = "ABRIL";
			   $n = 30;
	   break;
	   case 5: $mes = "MAIO";
			   $n = 31;
	   break;
	   case 6: $mes = "JUNHO";
			   $n = 30;
	   break;
	   case 7: $mes = "JULHO";
			   $n = 31;
	   break;
	   case 8: $mes = "AGOSTO";
			   $n = 31;
	   break;
	   case 9: $mes = "SETEMBRO";
			   $n = 30;
	   break;
	   case 10: $mes = "OUTUBRO";
			   $n = 31;
	   break;
	   case 11: $mes = "NOVEMBRO";
			   $n = 30;
	   break;
	   case 12: $mes = "DEZEMBRO";
			   $n = 31;
	   break;
   }
   
   
	   print '<table class="tabela" >';//construção do calendario
	   print '<tr>';
	   print '<td class="mes"><a href="?data='.$dia.'/'.$mes_ant.'/'.$ano_ant.'" title="Mês anterior">  «  </a></td>';/*mês anterior*/
	   print '<td class="mes" colspan="5">'.$mes.'/'.$ano.'</td>';/*mes atual e ano*/
	   print '<td class="mes"><a href="?data='.$dia.'/'.$mes_prox.'/'.$ano_prox.'" title="Próximo mês">  »  </a></td>';/*Proximo mês*/
	   print '</tr><tr>';

	   print '<td>Marcos</td>';
		   
		   
	   for($i = 1; $i <= $n; $i++ ){/*agora vamos no banco de dados verificar os evendos*/
			   $dtevento = $i."-".$month."-".$ano;
		   $sqlag = mysql_query("SELECT * FROM agenda WHERE dtevento = '$dtevento'") or die(mysql_error());
				   $num = mysql_num_rows($sqlag);/*quantos eventos tem para o mes*/
				   $idev = @mysql_result($sqlag, 0, "dtevento");
				   $eve = @mysql_result($sqlag, 0, "evento");			   
				   if($num > 0){/*prevalece qualquer dia especial do calendario, por isso está em primeiro*/
			  print '<td class="evt">';
			  print '<a href="?d='.$idev.'&data='.$dia.'/'.$month.'/'.$ano.'" title="'.$eve.'">'.$i.'</a>';
			  print '</td>';
			  $dt++;/*incrementa os dias da semana*/
					  $qt++;/*quantos eventos tem no mes*/

		   
		   }else{/*imprime os dias normais*/
					   print '<td class="td">';
			   print $i;
			   print '</td>';
				   }
	   }
	   print '</tr>';
	   print '</table>';
	
   ?>
   
   </body>
   </html>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

"...preciso que as datas que o funcionário esteja em férias fiquem em outra cor.

Assim... o funcionário vai tirar férias do dia 10/01/2014 até 20/01/2014. Então, quero que entre esses dias, a tabela fique de outra cor. "

 

Dessa forma, todos vão poder controlar as férias da equipe de maneira bem visual e fácil, evitando férias encavaladas.

 

Exemplo (aqui mudei só a cor da fonte pra ficar mais fácil postar mas o ideal é que a célula fique de outra cor)

 

Janeiro

Marcos 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

João 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

José 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que vc acha fácil!!! Me diz como. Eu vou ter um campo data inicial e um data final. Minha dúvida é como fazer para a tabela mostrar todas entre a inicial e final, lembrando que pode trocar de mês, ou seja, as férias podem começar em janeiro e terminar em fevereiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O funcionário pode tirar em até três períodos... tô armazenando cada período em um campo início e fim.

 

dtinicio1 e dtfim1

dtinicio2 e dtfim2

dtinicio3 e dtfim3

 

Essa é minha maior dúvida. Se as férias começam dia 10 e terminam dia 20 como eu faço, nesse script que é dinâmico, pra que mostre todos esses dias marcados em outra cor. Se a tabela não fosse dinâmica seria fácil. Mas o script ficaria grande demais porque eu teria que fazer todos os 365 dias do ano na mão.

 

A tabela tá assim:

 

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `servidor` varchar(200) NOT NULL,
  `dtinicio1` date NOT NULL,
  `dtfim1` date NOT NULL,
  `dtinicio2` date DEFAULT NULL,
  `dtfim2` date DEFAULT NULL,
  `dtinicio3` date DEFAULT NULL,
  `dtfim3` date DEFAULT NULL,
  `user_altera` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá... eu não tô conseguindo fazer com que os dias entre as datas que me interessam fiquem de outra cor. Algo assim:

"entre os dias 01/01/2014 e 10/01/2014".
Só tô conseguindo que o dia 01/01 e o dia 10/01 fiquem de outra cor. Os dias 02/01 a 09/01 não estão ficando.

Alguém tem alguma idéia?

Tô fazendo assim:

if (($atual >= $inicio1) and ($atual <= $fim1))

onde $atual é o dia que o calendário vai mostrar e $inicio1 e $fim1 são o início e o fim dos dias que quero de outra cor.

<table> 
<tr>
<td><?php echo $nome; ?></td>
<td class="<?php 
		if (($atual >= $inicio1) and ($atual <= $fim1)){ echo $cor;}
		elseif ((atual >= $inicio2) and ($atual <= $fim2)){ echo $cor;}
		else { echo $cor1;}
		?>"><?php echo $i; ?></td>
	<?php
	   $dt++;
	   }else{/*imprime os dias normais*/


	?>
<td class="<?php 
		if (($atual >= $inicio1) and ($atual <= $fim1)){ echo $cor;}
		elseif ((atual >= $inicio2) and ($atual <= $fim2)){ echo $cor;}
		else { echo $cor1;}
		?>"><?php echo $i; ?></td>
		<?php 
		 $dt++;
		}
	   	}
	?>
</tr>
</table>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, parece que é apenas problema de lógica, agora que você já tem os dados e o código que troca a cor.

 

Se aceita uma sugestão para a exibição, você poderia calcular, percentualmente, quanto cada dia foi solicitado como férias, de acordo com o número de funcionários. E então calcular um intervalo de cor, indicando cada dia com a respectiva cor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lucas.. não entendi o que vc sugeriu... como calcular percentualmente vai me dizer que o José está em férias no dia 02/01 e esse dia tem que estar colorido?

 

Eu achei que fosse uma questão mais simples.... também acho que é de lógica mas como fazer? É algum sinal que não tô sabendo...

A lógica é ... se dia 02 está entre dia 01 e 03, muda a cor

Eu não sei se tem algum operador "entre". Não achei nada no manual do php. Por isso, achei que assim resolveria.

 

if (($atual >= $inicio1) and ($atual <= $fim1))

 

 

Tô achando que na manipulação das datas, o php não tá entendendo que é data... a data realmente tá num formato diferente mas eu não consegui resolver isso... o formato é esse:

 

 

 

2014-1-1

 

Pra tirar os zeros, sei que é com a função ltrim

 

e pra colocar de novo (2014-01-01)?

 

Melhor.... alguém sabe a função pra transformar a data em número? Como o mktime só que só pra dia, mês e ano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você pode converter a data para número (timestamp) assim:

http://php.net/strtotime

 

exemplo:

 

$timestamp = strtotime('2014-02-12');

:clap: :clap: :clap: :clap: :clap:

 

Finalmente uma vida inteligente neste forum!!!!!

 

Valeu andersondanilo!!!! É isso que a gente precisa.... respostas simples e objetivas... direto no ponto!!!

 

Aliás... eu já frequento esse fórum há muito tempo e sempre tem uma boa alma que consegue resolver os problemas.... tem muita gente boa mesmo.... essas últimas postagens é que não foram das melhores....

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.