Ir para conteúdo

POWERED BY:

Arquivado

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

cleidomonscole

[Resolvido] Gestor De Tarefas Com Escalonamento

Recommended Posts

boas pessoal,

 

Estou a criar um gestor de tarefas, ou seja, pode-se inserir tarefas que devem ser executadas mediante data inicial e final. Não sei se conhecem o google calendar, é do genero.

 

Cheguei a fase em que quero colocar tarefas com prioridade mais alta, e portanto a tarefa com a prioridade mais alta tem que ser executada em primeiro antes das tarefas que ja estão programadas, ou seja, tenho que pegar nas outras tarefas e move-las para uma data superior à data de finalização da tarefa com prioridade alta. Aqui é que não sei como começar o algoritmo que faça o escalonamento.

 

o que pretendo é imaginem:

 

tenho as seguintes tarefas

 

tarefa a - segunda (prioridade normal ou media)

tarefa b - terça (prioridade normal ou media)

tarefa c - quarta (prioridade normal ou media)

tarefa d - quinta (prioridade normal ou media)

tarefa e - sexta (prioridade normal ou media)

 

Agora entrou uma tarefa com prioridade alta que tem que ser colocada para segunda, ou seja, todas as outras tem que avançar um dia

 

tarefa f - segunda (prioridade alta)

tarefa a - terça (prioridade normal ou media)

tarefa b - quarta (prioridade normal ou media)

tarefa c - quinta (prioridade normal ou media)

tarefa d - sexta (prioridade normal ou media)

descanso - sabado

descanso - domingo

tarefa e - segunda (prioridade normal ou media)

 

e portanto isto mexe com datas

 

 

Alguem conhece um script ou algoritmo que faça isso, porque não sei por onde começar para fazer o processo, porque existem mtas verificações/validaçoes a fazer.

 

Agradeço desde ja a ajuda, obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só... acho que posso te dar um caminho!

Toda tarefa tem uma data de inicio e fim. Então vamos ver se entendi sua regra de negocio!

Foi inserida uma tarefa com prioridade alta que deve ser a primeira na fila e a data das outras devem ser alteradas . Aí você recupera as informações desta tarefa e carrega em memoria, tipo: $dataInicio, $dataFim e $idTarefa

Depois faz um select nas tarefas ordenando pela data de inicio excluindo o Id da tarefa que você está colocando no topo da fila. Com as tarefas ordenadas voce executa um while (ou outro laço que preferir) e faz a regra de update dentro dele, mais ou menos assim:

 

//Voce executa uma consulta para recuperar o valor destas variáveis
$id_tarefa_prioridade_alta;
$dataini_tarefa_prioridade_alta;
$datafim_tarefa_prioridade_alta;
$i=0; //contador para atualizar data

$num_rows = mysql_num_rows($query);
while($tarefas = mysql_fetch_array($query)){
$i++;
if($i == 1){//Para garantir que só vai fazer isso na primeira interação do laço
	$nova_dataini = $tarefas[‘data_inicio’];
	$nova_datafim = $tarefas[‘data_fim’];
	$id_tarefa_atual = $tarefas['id_tarefa'];
	$sql = mysql_query("UPDATE tab_tarefas set data_ini= $nova_dataini, data_fim=$nova_datafim where id_tarefa=$id_tarefa_prioridade_alta");

}
else{

	$sql = mysql_query("UPDATE tab_tarefas set data_ini= $nova_dataini, data_fim=$nova_datafim where id_tarefa=$id_tarefa_atual");
	$nova_dataini = $tarefas[‘data_inicio’];
	$nova_datafim = $tarefas[‘data_fim’];
	$id_tarefa_atual = $tarefas['id_tarefa'];
	if($i == $num_rows){//Para garantir a atualização no ultimo registro
		$sql = mysql_query("UPDATE tab_tarefas set data_ini= $nova_dataini, data_fim=$nova_datafim where id_tarefa=$id_tarefa_atual");
	}
}

}

 

Cara não me preocupei com regra de negocio, apenas fiz um esquema para trocar as data. Acho que deve funcionar... Mas como já falei é só uma idéia que tive!!! Se vai funcionar ou ser util é contigo.

Ufá... Já programei demais para uma sexta de manha... kkkk

Abraços

Uerlen Santos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria mais fácil trabalhar com níveis de prioridade?

 

Ex.:

 

tarefa f - segunda (prioridade alta) = n: 1 / data

tarefa a - terça (prioridade media) :2 / data

tarefa b - quarta (prioridade normal) 5 / data

tarefa c - quinta (prioridade normal) 5 / data

tarefa d - sexta (prioridade normal) 5 / data

descanso - sabado

descanso - domingo

 

 

Lógica:

 

No cadastro de uma tarefa ela é atribuída a opção de nível, ou seja, normal, media ou alta. As datas serão mesmo a de cadastro inserida pelo servidor.

 

Script:

 

tarefas.sql

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

--
-- Estrutura da tabela `tarefas`
--

CREATE TABLE EXISTS `tarefas` (
 `id` int(20) NOT NULL AUTO_INCREMENT,
 `nome` varchar(255) CHARACTER SET utf8 NOT NULL,
 `resumo` longtext NOT NULL,
 `data` date NOT NULL,
 `nivel` int(5) NOT NULL,
 `situacao` varchar(100) CHARACTER SET utf8 NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Extraindo dados da tabela `tarefas`
--

INSERT INTO `tarefas` (`id`, `nome`, `resumo`, `data`, `nivel`, `situacao`) VALUES
(1, 'Projeto Alves', 'Esse é um teste do projeto alves.', '2012-05-18', 5, 'ativo'),
(2, 'Projeto Renato', 'Urgente Projeto', '2012-05-15', 1, 'ativo'),
(3, 'Projeto Celular', 'Aplicativos novos', '2012-05-14', 1, 'ativo'),
(4, 'Projeto concluido exemplo', 'Porjeto de exemplo concluido', '2012-05-07', 1, 'realizada'),
(5, 'Projeto Julio', 'Teste 123 teste', '2012-05-01', 5, 'ativo');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 

tarefas.php

<style>
ul {margin:0; padding:0; list-style:none;}
li {margin:0 0 20px 0; width:100%; background:#DFDFDF; border:1px solid #CCC; }
</style>
<?php 


# Informa qual o conjunto de caracteres será usado.
header('Content-Type: text/html; charset=utf-8');
// Conexão com o banco de dados
$conn = @mysql_connect("localhost", "root", "") or die ("Problemas na conexão1.");
$db = @mysql_select_db("tarefas", $conn) or die ("Problemas na conexão2");

mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

//FUNÇÃO DATE() 
$data_hoje = date("Y/m/d"); 
$break = 0;
$sql = mysql_query ("SELECT * FROM tarefas WHERE situacao = 'ativo' ORDER BY nivel, data ");
echo "<ul>";
while($t = mysql_fetch_array($sql)) {

$nome = $t["nome"];
$resumo = $t["resumo"];
$nivel = $t["nivel"];
$data = $t["data"];
$situacao = $t["situacao"];
if($nivel == 5) {$nivel = "Normal"; $color = "";}
else if($nivel == 1) {$nivel = "Alta"; $color = "#F60";}
else if($nivel == 2) {$nivel = "Médio"; $color = "#C90";}

           // FUNÇÃO CONTA OS DIAS // ***********************
		//créditos da função: http://blog.thiagobelem.net/calculando-a-diferenca-em-dias-entre-duas-datas/

		// Define os valores a serem usados
		$data_inicial = $data;
		$data_final = $data_hoje;

		// Usa a função strtotime() e pega o timestamp das duas datas:
		$time_inicial = strtotime($data_inicial);
		$time_final = strtotime($data_final);

		// Calcula a diferença de segundos entre as duas datas:
		$diferenca = $time_final - $time_inicial; // 19522800 segundos

		// Calcula a diferença de dias
		$dias = (int)floor( $diferenca / (60 * 60 * 24)); // 225 dias
		// FIM FUNÇÃO CONTA OS DIAS // ***********************

		if($dias == 0) {$tempo = "Projeto cadastrado Hoje";} else { $tempo = "Já passaram: ".$dias." dias";}

if($break == '0') {


	echo "<div>

	<div>Tarefa a ser realizada hoje: $nome | $tempo | Resumo abaixo:</div>


	<li style='background:red;'><div>Nome: $nome</div> <div>Resumo: $resumo</div> Data de cadastro: $data<div>Prioridade: $nivel</div></li>


<div>Outros Projetos:</div>
</div>";



	} else {


echo "<div>

	<li style='background:$color;'><div>Nome: $nome</div> <div>Resumo: $resumo</div> Data de cadastro: $data<div>Prioridade: $nivel</div> $tempo</li>



</div>"; }

$break++;
}
echo "</ul>";
?>

 

Imagem exemplo do script:

 

exemplo.png

 

Um exemplo prático que escrevi, a lógica é simples. O ORDER BY é por data antiga, porém a prioridade é definida pelo nível e o WHERE é somente para as tarefas ativas, sendo possível então tratar os dados separados. A vantagem de ter em níveis e não por datas é a seguinte:

 

Veja que adaptei um script que peguei na net para contagem de dias diferentes entre datas, ou seja, você pode ver quantos dias a tarefa está mofando, digo, registrada. E a vantagem de não ter que alterar todas as datas de todas as tarefas, imagine 500 tarefas? 1000? haja servidor.

 

Bom, qualquer dúvida, contate! não samu suporte mais samu amigo! kkk

 

Abraço.

 

Ei adicionei agora um projeto com a data antiga (veja na imagem exemplo) porém com a prioridade 2. ou seja, Média.. repare na imagem que ela aparece antes dos dois que estão com prioridade "Alta", que por sua vez usam para se diferenciar pelo critério data antiga. (pode ser alterado ok?)

 

Abraço.

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.