Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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.
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)
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.
se possível, me envie a estrutura de suas tabelas
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 ;
--
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
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
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?! ;)
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.
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>Não Apontados
Nome: Data:
Ciclano 01/02/2014
Fulano 02/02/2014
Fulano 03/02/2014
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
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á
//verifica se tal hora tá disponível
if(mysql_num_rows($exec_hora)>0){
echo "disponível";
}else{
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