Lançamento de receitas mensais

03/03/2024

0

PHP

esse código está fazendo lançamentos mensais, porem quando a data inicial é por exemplo dia 31 e o proximo mês não tem esse dia ele pula esse lançamento.

exemplo, 15 lançamentos, data inicial 31-03-2024 :

2025-06-30
2025-05-31
2025-04-30
2025-03-31
2025-02-28
2025-01-31
2024-12-31
2024-11-30
2024-10-31
2024-09-30
2024-08-31
2024-07-31
2024-06-30
2024-05-31
2024-03-31

apenas falta o primeiro lançamento do mês 04, o do próximo ano já é feito corretamente, aqui está o código:

function criarLancamentosMensais($tipolancamento, $descricao, $dataInicial, $valor, $categoria, $recorrente, $numeroDeVezes, $observacoes) {
try {
$conn = ConectarAoBanco();

$stmt = $conn->prepare("INSERT INTO lancamentos (tipo, descricao, datalancamento, valor, categoria, recorrente, observacoes)
VALUES (?, ?, ?, ?, ?, ?, ?)");

$stmt->bind_param("sssssss", $tipolancamento, $descricao, $dataInicial, $valor, $categoria, $recorrente, $observacoes);
$stmt->execute();

$data = new DateTime($dataInicial);
$diaInicial = $data->format('d'); // Salva o dia da data inicial
for ($i = 1; $i <= $numeroDeVezes - 1; $i++) {
$data->modify('+1 month');

$ultimoDiaDoMesAtual = $data->format('t');

$diaDoProximoLancamento = min($diaInicial, $ultimoDiaDoMesAtual);

$dataFormatada = $data->format('Y-m-') . str_pad($diaDoProximoLancamento, 2, '0', STR_PAD_LEFT);

$stmt->bind_param("sssssss", $tipolancamento, $descricao, $dataFormatada, $valor, $categoria, $recorrente, $observacoes);
$stmt->execute();
}

if ($stmt->affected_rows > 0) {
echo "Lançamentos inseridos com sucesso!";
} else {
echo "Erro ao inserir lançamentos!";
}

$stmt->close();
} catch (Exception $e) {
echo json_encode(array('success' => false, 'message' => 'Erro ao inserir lançamentos: ' . $e->getMessage()));
}
}
Nadiel Paula

Nadiel Paula

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar