Ajuda para intervalo de datas
[Concluído]
Pessoal preciso de ajuda que parece simples mais simplemente buguei ao tentar fazer srsrs. Vamos lá.
No banco tenho uma tabela (contracts) que tem uma coluna (end_contract) informando a data do fim do contrato, gostaria de criar um método para verificar se tem alguma data (na coluna end_contract) com 60 dias ou menos do dia atual (hoje por exemplo) para a conclusão do contrato e se tiver disparar um e-mail para os admins informando que tal contrato está se vencendo.
O disparo de email é tranquilo, mais buguei na lógica da informação srsrsr.
Eu fiz o seguinte código, porém ele era para retornar 4 datas, mas retorna apenas a última data inserida no banco.
$initialDate = new \DateTime();
$finalDate = Contracts::where('end_contract', '>=', '2021-3-4')->get();
$date = [];
foreach ($finalDate as $d){
//$date = $d;
dd($d);
}
Imagem do banco na coluna end_contracts: https://uploaddeimagens.com.br/imagens/D-3D56o
Olá, Roberto!
Tudo bem?
O Laravel já trás por default a poderosa classe de Carbon, com ela é MUITO mais simples trabalhar com datas.
Pesquisa na barra de search por interval:
https://carbon.nesbot.com/docs/
Qualquer dúvida me retorna, tá bom?
Aí onde está o nó Carlos, eu vou usar o Carbon para pegar a quanidade de dias que falta entre duas datas (a de hoje e a da coluna end_contract) porém ao percorrer o loop foreach ele retorna apenas a última data ao invés de todas as datas.
Não sei se meu raciocionio está correto, mas a variavel $finalDate é uma collection e seu debugar com DD eu eu vejo os arrays com todas as datas maiores do que a data de hoje, porém quando eu jogo no Loop só retorna a última, o ideal é percorrer no Loop armazenando na variavel $date cada quantidade de dias já retornando o valor tipo (indice [0] = 45, [1] = 56 ....), dai faço as verificações com os If's para fazer as ações que quero.
Em resumo o problema está no Loop, que não esta percorrendo as 4 datas que tenho salvo no banco que atende a este critério do Where.
$initialDate = new \DateTime();
$finalDate = Contracts::where('end_contract', '>=', '2021-3-4')->get();
$date = [];
foreach ($finalDate as $d){
//$date = $d;
dd($d);
}
Carlos fera, consegui em parte resolver meu problema. Mas ainda preciso da sua especialdiade srsrsr.
$dataInicial = Carbon::now();
$dataQuery = Contracts::where('end_contract', '>=', $dataInicial)->get();
$newDate = [];
foreach ($dataQuery as $date){
$dateCarbon = new Carbon($date->end_contract);
$newDate[] = $dateCarbon->diff($dataInicial)->days;
}
// o problema está aqui
// aqui eu preciso percorrer o array e verificar se nele tem algum número que seja igual ou menor que 60, esses númros são a diferença entre as duas datas (hoje e a data que está na coluna end_contract).
Só que quando fui no BD e alterei para uma data que fosse maior que 60 dias ainda continuou aparecendo retorno do IF.
Pergunto, como eu faria para verificar o retorno do array (são os números: 53, 20 e 25) menores ou igual a 60?
if(array_key_exists("60", $newDate) <= 60){
echo 'tem ' . Count($newDate);
} else {
echo 'não tem';
}
var_dump($newDate);
// retorno do var_dump
tem 4 array(4) { [0]=> int(123) [1]=> int(53) [2]=> int(20) [3]=> int(25) }
Como a sua pergunta é algo muito particular, vou pedir que encaminhe ela para [email protected], porque assim posso te ajudar de forma mais direcionada.
Número do ticket: 1583
Se possível amigo, manda o código (no GitHub) também.
Fala Roberto, tudo bem?
Vamos por partes:
1 - Você quer obter os contratos com vencimentos menores ou iguais até 60 dias à frente, certo?
Ex: Hoje (17/03/2021) + 60 dias = (17/05/2021). Contratos que vencem até o dia 17/05/2021.
2 - Como você não quer que ultrapasse esse range de 60 dias, basta usar o operador <= (menor igual).
Ou seja, contratos que não ultrapasse a data de vencimento 17/05/2021.
3 - Datas que comecem hoje (17/03/2021) que vão até (17/05/2021).
Ex: SELECT * FROM contracts WHERE end_contract >= 17/03/2021 AND end_contract <= 17/05/2021.
Dessa forma você recupera todos os contratos à partir da data atual até a data limite especificada (17/05/2021).
Assim que possível, teste a solução e nos informe aqui!
Forte abraço! :)
Só esqueci de deixar o snippet:
<?php
A solução que mandei no e-mail, explorar a classe de Carbon para resolver as questões de data, e já retornar os resultados filtrados diretamente na query (isso otimiza o sistema):
// use Carbon\Carbon;
$dataQuery = Contracts::whereDate('end_contracts', '>=', Carbon::now()->subDays(60))->get();
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!