Boa noite senhores, gostaria de algum norte de como vou fazer isso ou um modelo, quero alterar campos de uma determinada tabela, após passada da data atual. exemplo eu tenho uma fatura com o vencimento para o dia 10/06/2021, após passada esta data a coluna “status” desse campo se alteraria para “Atrasada”.
Geralmente isso é feito através de rotinas agendadas. Nesse caso, rodando todo dia em um determinado horário. Essa rotina buscaria no banco os registros vencidos e faria a alteração nos campos necessários.
Poderia me explicar melhor, como faço essa rotina?
Olha, não conheço muito de PHP (nunca usei na verdade). Mas se estiver usando o tal do Laravel, ele tem um esquema de schedule, veja:
https://laravel.com/docs/8.x/scheduling
Achei também um projeto no git: php-cron-scheduler
Não uso, mas vou da uma olhada.
Tem esse outro projeto que vi no github que parece ser independente de frameworks: https://github.com/lavary/crunz
Crunz
Install a cron job once and for all, manage the rest from the code.
Crunz is a framework-agnostic package to schedule periodic tasks (cron jobs) in PHP using a fluent API.
Crunz is capable of executing any kind of executable command as well as PHP closures.
eu estava buscando algo mais simples, após entrega no sistema ele iria varrer e atualizar os campos de acordo a data atual com a data de vencimento. achei esse aqui mas não conseguir implementar
function verifica_status_fatura($con){
date_default_timezone_set('America/Sao_Paulo');
$data_hoje = date('d/m/Y');
$data_dias = date('d/m/Y', strtotime('+3 days'));
$sql = $con->prepare("SELECT id FROM faturas WHERE data_vencimento BETWEEN ? AND ? AND status = 1 AND renew = 0");
$sql->bind_param("ss", $data_hoje, $data_dias);
$sql->execute();
return $sql->get_result()->num_rows;
}
function seleciona_faturas_a_vencer($con){
date_default_timezone_set('America/Sao_Paulo');
$data_hoje = date('d/m/Y');
$data_dias = date('d/m/Y', strtotime('+3 days'));
if(verifica_status_fatura($con) > 0){
$sql = $con->prepare("SELECT * FROM faturas WHERE data_vencimento BETWEEN ? AND ? AND status = 1 AND renew = 0");
$sql->bind_param("ss", $data_hoje, $data_dias);
$sql->execute();
$get = $sql->get_result();
$total = $get->num_rows;
if($total > 0){
while($dados = $get->fetch_array()){
$id_fatura = $dados['id'];
$id_cliente = $dados['id_cliente'];
$id_servico = $dados['id_servico'];
$valor = $dados['valor'];
$data_hoje = date('d/m/Y');
$proximovencimento = date('d/m/Y', strtotime('+30 days'));
cria_fatura_a_pagar($con, $id_cliente, $id_servico, $valor, $data_hoje, $proximovencimento);
atualiza_fatura_antiga($con, $dados['id']);
}
}
}
}
function cria_fatura_a_pagar($con, $id_cliente, $id_servico, $valor, $data_criado, $data_vencimento){
$sql = $con->prepare("INSERT INTO faturas (id_cliente, id_servico, valor, data_criado, data_vencimento) VALUES (?,?,?,?,?)");
$sql->bind_param("sssss", $id_cliente, $id_servico, $valor, $data_criado, $data_vencimento);
$sql->execute();
if($sql->affected_rows > 0){
return true;
}else{
return false;
}
}
function atualiza_fatura_antiga($con, $id){
$sql = $con->prepare("UPDATE faturas SET renew = 1 WHERE id = ?");
$sql->bind_param("s", $id);
$sql->execute();
if($sql->affected_rows > 0){
return true;
}else{
return false;
}
}
?>
Mas não vi nada de schedule nesse seu código. Parece que está implementando apenas a lógica de recuperar e atualizar os registros vencidos.
Vc tem que arrumar um mecanismo do PHP para implementar a rotina. No java, por exemplo, tem como criar threads e timetasks, e ainda há bibliotecas (como o quartz, por exemplo) que ajudam também nesse tipo de implementação.
Acredito que exista algo semelhante no PHP para a mesma finalidade, porém, infelizmente, não conheço o suficiente para te indicar algo.
obrigado!