[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Roberto Ferreira
Criador Roberto Ferreira 04/03/2021

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.

Criador Roberto Ferreira 04/03/2021

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

Roberto Ferreira
Manager Carlos Ferreira 04/03/2021

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?

Carlos Ferreira
Criador Roberto Ferreira 04/03/2021

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);

}

 

 

 

Roberto Ferreira
Criador Roberto Ferreira 04/03/2021

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) }

 

Roberto Ferreira
Manager Carlos Ferreira 04/03/2021

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.

Carlos Ferreira
Rafael Felipe 04/03/2021

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! :)

Rafael Felipe
Rafael Felipe 04/03/2021

Só esqueci de deixar o snippet:

<?php

use Illuminate\Support\Facades\DB;
 
$startsAt = new \DateTime('America/Sao_Paulo');
$endsAt = clone $startsAt->add(new \DateInterval('P2M')); // Adiciona período de 2 meses.
$contracts = DB::select(
'SELECT * FROM contracts WHERE end_contract >= ? AND end_contract <= ?',
[$startsAt->format('Y-m-d'), $endsAt->format('Y-m-d')]
);
 
Rafael Felipe
Manager Carlos Ferreira 04/03/2021

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();

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!