Ir para conteúdo

POWERED BY:

violin101

PHP - Gerar vencimento parcelas com período variado

Recommended Posts

Pessoal, saudações.

 

Por favor, me perdoa em recorrer ao auxílio dos amigos, mas infelizmente estou com uma dúvida e não estou conseguindo resolver.

 

Preciso de ajuda, para criar uma rotina onde o sistema possa Gerar/Calcular vencimentos com períodos variados, ou seja:
00/30/60/90

28/42/56

etc

 

Como faço para o Sistema entender que os PERÍODOS VARIADOS, seja a quantidade de parcelas e vencimentos ?

 

Observação: peço desculpa se postei minha dúvida na postagem errada.

 

Grato,

 

Cesar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para implementar uma rotina em PHP 8.2 que gere vencimentos com períodos variados, você pode seguir o exemplo abaixo. A ideia é criar uma função que aceite um array de intervalos e a data inicial, retornando as datas de vencimento conforme os períodos definidos.

IDEONE: https://ideone.com/ytjlxc

<?php

function gerarVencimentos(DateTime $dataInicial, array $intervalos): array {
    $datasVencimento = [];

    foreach ($intervalos as $dias) {
        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$dias} days");
        $datasVencimento[] = $dataVencimento;
    }

    return $datasVencimento;
}

// Exemplo de uso
$dataInicial = new DateTime('2024-07-06');
$intervalos = [0, 30, 60, 90, 28, 42, 56];

$datasVencimento = gerarVencimentos($dataInicial, $intervalos);

foreach ($datasVencimento as $data) {
    echo $data->format('Y-m-d') . PHP_EOL;
}

Explicação:
 

Função gerarVencimentos:

Recebe a data inicial e um array de intervalos em dias.

Clona a data inicial para evitar modificações na data original.

Utiliza o método modify do objeto DateTime para adicionar os dias do intervalo.

Adiciona a nova data de vencimento ao array de datas de vencimento.

 

Exemplo de Uso:

Define a data inicial e os intervalos.

Chama a função gerarVencimentos para obter as datas de vencimento.

Itera sobre o array de datas de vencimento e imprime cada data.

Essa abordagem permite que o sistema entenda e calcule os vencimentos com períodos variados conforme os intervalos fornecidos

Obs.: Se a versão do PHP não suportar tipagem, remova:

<?php

function gerarVencimentos($dataInicial, $intervalos) {
    $datasVencimento = [];

    foreach ($intervalos as $dias) {
        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$dias} days");
        $datasVencimento[] = $dataVencimento;
    }

    return $datasVencimento;
}

// Exemplo de uso
$dataInicial = new DateTime('2024-07-06');
$intervalos = [0, 30, 60, 90, 28, 42, 56];

$datasVencimento = gerarVencimentos($dataInicial, $intervalos);

foreach ($datasVencimento as $data) {
    echo $data->format('Y-m-d') . PHP_EOL;
}




 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro amigo, Williams Duarte

 

Muito obrigado por sua explicação e orientação.

 

Apenas uma dúvida: se precisar utilizar os INTERVALOS para fazer a divisão do VALOR parcelado, como ficaria ?

exemplo:

R$ 1.000,00 

intervalos: 28/42/56 dias.

 

Ou nesse caso, o correto seria informa a quantidade de parcelas e depois os intervalos para as datas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, Williams

 

fiz assim e deu certo.

 

    //data atual
	$dataInicial = new DateTime();
    
    //Intervalos de Dias para Vencer
	$intervalos = [15,30,45];	
	
    //Quantidade de Intervalos
	$qtd_parc = count($intervalos);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhor usar dentro da função:

https://ideone.com/nv22yr

<?php

function gerarParcelas($dataInicial, $intervalos, $valorTotal) {
    $datasParcelas = [];
    $quantidadeParcelas = count($intervalos);
    $valorParcela = $valorTotal / $quantidadeParcelas;

    foreach ($intervalos as $dias) {
        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$dias} days");
        $datasParcelas[] = [
            'data_vencimento' => $dataVencimento,
            'valor_parcela' => $valorParcela
        ];
    }

    return $datasParcelas;
}

// Exemplo de uso
$dataInicial = new DateTime('2024-07-06');
$intervalos = [28, 42, 56];
$valorTotal = 1000.00;

$parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);

foreach ($parcelas as $parcela) {
    echo "Data de Vencimento: " . $parcela['data_vencimento']->format('Y-m-d') . PHP_EOL;
    echo "Valor da Parcela: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . PHP_EOL;
    echo "-----------------------" . PHP_EOL;
}



Vamos supor que você queira aplicar juros de 2% apos 30 dias, ai você cria outra função responsavel para isto, separando responsabilidades fica mais organizado e sabe oque cada coisa faz!

https://ideone.com/4fQCRe
 

<?php

function calcularJuros($valor, $dias, $taxaJuros, $diasSemJuros) {
    if ($dias > $diasSemJuros) {
        $diasComJuros = $dias - $diasSemJuros;
        $valorComJuros = $valor * pow((1 + $taxaJuros / 100), ($diasComJuros / 30));
        return $valorComJuros;
    }
    return $valor;
}

function gerarParcelas($dataInicial, $intervalos, $valorTotal, $taxaJuros, $diasSemJuros) {
    $datasParcelas = [];
    $quantidadeParcelas = count($intervalos);
    $valorParcela = $valorTotal / $quantidadeParcelas;

    foreach ($intervalos as $dias) {
        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$dias} days");
        $valorParcelaComJuros = calcularJuros($valorParcela, $dias, $taxaJuros, $diasSemJuros);
        $datasParcelas[] = [
            'data_vencimento' => $dataVencimento,
            'valor_parcela' => $valorParcelaComJuros
        ];
    }

    return $datasParcelas;
}

// Exemplo de uso
$dataInicial = new DateTime('2024-07-06');
$intervalos = [28, 42, 56];
$valorTotal = 1000.00;
$taxaJuros = 2; // 2% de juros ao mês
$diasSemJuros = 30; // Sem juros para os primeiros 30 dias

$parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal, $taxaJuros, $diasSemJuros);

foreach ($parcelas as $parcela) {
    echo "Data de Vencimento: " . $parcela['data_vencimento']->format('Y-m-d') . PHP_EOL;
    echo "Valor da Parcela: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . PHP_EOL;
    echo "-----------------------" . PHP_EOL;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Williams, saudações

 

Baseado nas suas instruções, fiz escrevi uma Função onde aproxima a última parcela, ou seja:
R$ 1000,00 / 3 

1 - 333,33

2 - 333,33

3 - 333,34

 

Como faço para implementar a última parcela para arredondar ?

 

o código fico assim, talvez, tenho colocado no local errado.

 

    <?php
	// Exemplo de uso
	$dataInicial = new DateTime();
	$intervalos = [0,3,6];
	$valorTotal = 1000.00;		
	
	$qtd_parc = count($intervalos);
	
    // Converter o valor para o formato Real separado pela virgula
    echo "Valor da compra: R$ " . number_format($valorTotal, 2, ',', '.') . "<br><br>";
	
    // Apenas Exibi a quantidade de Intervalos	
	echo "Quantidade de intervalos: $qtd_parc <br><br>";

		
		function gerarParcelas($dataInicial, $intervalos, $valorTotal) {
			$datasParcelas = [];
			$quantidadeParcelas = count($intervalos);
			$valorParcela = $valorTotal / $quantidadeParcelas;
			
			$repete = 1;
			$somar_valor_parcela = 0;			
			while ($repete <= $quantidadeParcelas) {			
				if ($repete == $quantidadeParcelas) {				
					$valor_ultima_parcela = $valorTotal - $somar_valor_parcela;
					$somar_valor_parcela += number_format($valor_ultima_parcela, 2, '.', '');					
					$valor_final_parcelas = number_format($valor_ultima_parcela, 2, '.', '');
                    echo "Valor Parc. R$ " . number_format($valor_final_parcelas, 2, ',', '.') . "<br>";						
				} else {
					$somar_valor_parcela += number_format($valorParcela, 2, '.', '');
					$valor_final_parcela = number_format($valorParcela, 2, '.', '');
                    echo "Valor Parc. R$ " . number_format($valor_final_parcelas, 2, ',', '.') . "<br>";					
				}											
				$repete++;
			}		
/*
Até aqui fica assim.
Valor Parc. R$ 333,33
Valor Parc. R$ 333,33
Valor Parc. R$ 333,34 <== arredondou para cima
*/
          
          
			foreach ($intervalos as $dias) {
				$dataVencimento = clone $dataInicial;
				$dataVencimento->modify("+{$dias} days");
				$datasParcelas[] = [
					'data_vencimento' => $dataVencimento,
					'valor_parcela' => $valorParcela
				];
			}
			return $datasParcelas;		
		}

		$parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);
		
		echo "<br>";

		foreach ($parcelas as $parcela) {		
			echo $parcela['data_vencimento']->format('Y-m-d')  . " - Valor..: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.')  . "<br>";	
		}		

/*
Aqui mostra assim
2024-07-07 - Valor..: R$ 333,33
2024-07-10 - Valor..: R$ 333,33
2024-07-13 - Valor..: R$ 333,33 <== como arredondar esta última parcela
*/


?>

 

Grato,

 

Cesar

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua nova função ajustada com for, deixei mais limpa!

 

<?php
// Exemplo de uso
$dataInicial = new DateTime();
$intervalos = [0, 3, 6];
$valorTotal = 1000.00;

$qtd_parc = count($intervalos);

// Converter o valor para o formato Real separado pela vírgula
echo "Valor da compra: R$ " . number_format($valorTotal, 2, ',', '.') . "<br><br>";

// Apenas Exibir a quantidade de Intervalos
echo "Quantidade de intervalos: $qtd_parc <br><br>";

function gerarParcelas($dataInicial, $intervalos, $valorTotal) {
    $datasParcelas = [];
    $quantidadeParcelas = count($intervalos);
    $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100; // Calcula o valor base das parcelas (arredondando para baixo)
    $valorUltimaParcela = $valorTotal - ($valorParcela * ($quantidadeParcelas - 1)); // Calcula a última parcela para ajustar a soma total

    for ($i = 0; $i < $quantidadeParcelas; $i++) {
        if ($i == $quantidadeParcelas - 1) {
            $valorAtualParcela = $valorUltimaParcela; // Última parcela ajustada
        } else {
            $valorAtualParcela = $valorParcela; // Parcelas intermediárias
        }

        echo "Valor Parc. R$ " . number_format($valorAtualParcela, 2, ',', '.') . "<br>";

        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$intervalos[$i]} days");
        $datasParcelas[] = [
            'data_vencimento' => $dataVencimento,
            'valor_parcela' => $valorAtualParcela
        ];
    }

    return $datasParcelas;
}

$parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);

echo "<br>";

foreach ($parcelas as $parcela) {
    echo $parcela['data_vencimento']->format('Y-m-d') . " - Valor..: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . "<br>";
}
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 07/07/2024 at 13:15, Williams Duarte disse:

Sua nova função ajustada com for, deixei mais limpa!

 


<?php
// Exemplo de uso
$dataInicial = new DateTime();
$intervalos = [0, 3, 6];
$valorTotal = 1000.00;

$qtd_parc = count($intervalos);

// Converter o valor para o formato Real separado pela vírgula
echo "Valor da compra: R$ " . number_format($valorTotal, 2, ',', '.') . "<br><br>";

// Apenas Exibir a quantidade de Intervalos
echo "Quantidade de intervalos: $qtd_parc <br><br>";

function gerarParcelas($dataInicial, $intervalos, $valorTotal) {
    $datasParcelas = [];
    $quantidadeParcelas = count($intervalos);
    $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100; // Calcula o valor base das parcelas (arredondando para baixo)
    $valorUltimaParcela = $valorTotal - ($valorParcela * ($quantidadeParcelas - 1)); // Calcula a última parcela para ajustar a soma total

    for ($i = 0; $i < $quantidadeParcelas; $i++) {
        if ($i == $quantidadeParcelas - 1) {
            $valorAtualParcela = $valorUltimaParcela; // Última parcela ajustada
        } else {
            $valorAtualParcela = $valorParcela; // Parcelas intermediárias
        }

        echo "Valor Parc. R$ " . number_format($valorAtualParcela, 2, ',', '.') . "<br>";

        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$intervalos[$i]} days");
        $datasParcelas[] = [
            'data_vencimento' => $dataVencimento,
            'valor_parcela' => $valorAtualParcela
        ];
    }

    return $datasParcelas;
}

$parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);

echo "<br>";

foreach ($parcelas as $parcela) {
    echo $parcela['data_vencimento']->format('Y-m-d') . " - Valor..: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . "<br>";
}
?>

 

 

Amigo Williams, saudações.

 

Desculpa postar novamente minha dúvida.

O cálculo de Gerar Parcelamento, se eu fosse colocar essa função dentro de um JAVASCRIPT, como deveria fazer e chamar essa função ?

 

Obs.:

para esse cálculo o correto é fora do JAVASCRIPT ?

tentei colocar no JS e mostrar em uma TABELA, mas não consegui.

 

Grato,

 

Cesar

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo Williams, saudações.

 

tentei assim, sem sucesso
 

  function gerarParcelas() {
            //pega input do form
            var dataInicial = document.getElementById("dtaentr").value;
            //SELECT passa com: 28/42/56
            var intervalos = document.getElementById("formaPgto").value;
            //pega input fo form - Soma Total
            var valorTotal = document.getElementById("vlrtotal").value;  

			var datasParcelas = [];
			var parcs = explode("/", intervalos);
			var quantidadeParcelas = count(parcs);						
			
			// Calcula o valor base das parcelas (arredondando para baixo)
		    var valorParcela = floor(valorTotal / quantidadeParcelas * 100) / 100; 
			
			// Calcula a última parcela para ajustar a soma total		
		    var valorUltimaParcela = valorTotal - (valorParcela * (quantidadeParcelas - 1)); 
			
			for (i = 0; i < quantidadeParcelas; i++) {
				if (i == quantidadeParcelas - 1) {
					valorAtualParcela = valorUltimaParcela; // Última parcela ajustada
				} else {
					valorAtualParcela = valorParcela; // Parcelas intermediárias
				}

				var dataVencimento = clone dataInicial;				
				dataVencimento->modify("+{parcs[i]} days");
							
				var datasParcelas[] = [
					'data_vencimento' => dataVencimento,
					'valor_parcela' => valorAtualParcela
				];
			}

			return datasParcelas;
		}


		foreach (parcelas as parcela) {
		
            html = "<tr>";
                 html += "<td width='10%' height='10'><input type='hidden' name='datVnc[]' value='"+infoprcs[0]+"'>"+parcela['data_vencimento']->format('Y-m-d')+"</td>";
                 html += "<td width='32%' height='10'><input type='hidden' name='parcel[]' value='"+infoprcs[2]+"'>"+number_format($parcela['valor_parcela'], 2, ',', '.') +"</td>";
                 html += "<td width='10%' height='10' style='text-align:center;'>"+
                          "<button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'>"+
                          "</button></td>";                       
            html += "</tr>";

            $("#tbparcs tbody").append(html);	
		}	

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste caso não ira funcionar, mas voce pode fazer uma chamada ajax para o servidor ou usar javascript puro.

Mas vou lhe mostrar um exemplo usando JQuery

parcelas.php

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $dataInicial = new DateTime($_POST['dataInicial']);
    $intervalos = explode(',', $_POST['intervalos']);
    $valorTotal = floatval($_POST['valorTotal']);

    function gerarParcelas($dataInicial, $intervalos, $valorTotal) {
        $datasParcelas = [];
        $quantidadeParcelas = count($intervalos);
        $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100;
        $valorUltimaParcela = $valorTotal - ($valorParcela * ($quantidadeParcelas - 1));

        for ($i = 0; $i < $quantidadeParcelas; $i++) {
            if ($i == $quantidadeParcelas - 1) {
                $valorAtualParcela = $valorUltimaParcela;
            } else {
                $valorAtualParcela = $valorParcela;
            }

            $dataVencimento = clone $dataInicial;
            $dataVencimento->modify("+{$intervalos[$i]} days");

            $datasParcelas[] = [
                'data_vencimento' => $dataVencimento->format('Y-m-d'),
                'valor_parcela' => number_format($valorAtualParcela, 2, ',', '.')
            ];
        }

        return $datasParcelas;
    }

    $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);

    header('Content-Type: application/json');
    echo json_encode($parcelas);
}
?>


index.html:
 

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Parcelamento</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <form id="parcelamentoForm">
        <label for="dtaentr">Data Inicial:</label>
        <input type="date" id="dtaentr" name="dtaentr"><br><br>
        <label for="formaPgto">Intervalos (dias):</label>
        <input type="text" id="formaPgto" name="formaPgto" placeholder="Ex: 0,3,6"><br><br>
        <label for="vlrtotal">Valor Total:</label>
        <input type="number" id="vlrtotal" name="vlrtotal"><br><br>
        <button type="button" onclick="gerarParcelas()">Gerar Parcelas</button>
    </form>

    <table id="tbparcs" border="1">
        <thead>
            <tr>
                <th>Data de Vencimento</th>
                <th>Valor da Parcela</th>
                <th>Ações</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>

    <script>
        function gerarParcelas() {
            const dataInicial = $('#dtaentr').val();
            const intervalos = $('#formaPgto').val();
            const valorTotal = $('#vlrtotal').val();

            $.ajax({
                url: 'parcelas.php',
                type: 'POST',
                dataType: 'json',
                data: {
                    dataInicial: dataInicial,
                    intervalos: intervalos,
                    valorTotal: valorTotal
                },
                success: function(parcelas) {
                    const tbody = $("#tbparcs tbody");
                    tbody.empty(); // Limpa a tabela antes de adicionar novas linhas

                    parcelas.forEach(function(parcela) {
                        let html = "<tr>";
                        html += "<td>" + parcela.data_vencimento + "</td>";
                        html += "<td>R$ " + parcela.valor_parcela + "</td>";
                        html += "<td style='text-align:center;'>" +
                            "<button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'>Editar</button>" +
                            "</td>";
                        html += "</tr>";

                        tbody.append(html);
                    });
                }
            });
        }
    </script>
</body>
</html>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma bordagem diferente se seu formulário HTML possui os campos necessários e um botão para disparar a função de gerar parcelas

 

geração de parcelas com JSON e AJAX ou Fetch API  /  PHP 7.4 quanto no PHP 8.3

 

<form id="parcelasForm">
    <input type="date" id="dtaentr" name="dtaentr" required>
    <select id="formaPgto" name="formaPgto" required>
        <option value="28/42/56">28/42/56</option>
        <option value="30/60/90">30/60/90</option>
        <!-- Outros intervalos -->
    </select>
    <input type="number" id="vlrtotal" name="vlrtotal" step="0.01" required>
    <button type="button" onclick="gerarParcelas()">Gerar Parcelas</button>
</form>
<table id="tbparcs">
    <thead>
        <tr>
            <th>Data de Vencimento</th>
            <th>Valor da Parcela</th>
            <th>Ação</th>
        </tr>
    </thead>
    <tbody>

    </tbody>
</table>

Enviar via AJAX

 

function gerarParcelas() {
    var dataInicial = document.getElementById("dtaentr").value;
    var intervalos = document.getElementById("formaPgto").value;
    var valorTotal = document.getElementById("vlrtotal").value;

    var dados = {
        dataInicial: dataInicial,
        intervalos: intervalos,
        valorTotal: valorTotal
    };

    $.ajax({
        url: 'gerar_parcelas.php', // URL do seu script PHP
        type: 'POST',
        data: JSON.stringify(dados),
        contentType: 'application/json',
        success: function(response) {
            var parcelas = JSON.parse(response);
            mostrarParcelas(parcelas);
        },
        error: function(error) {
            console.log("Erro: ", error);
        }
    });
}

function mostrarParcelas(parcelas) {
    var tbody = $("#tbparcs tbody");
    tbody.empty();

    parcelas.forEach(function(parcela) {
        var html = "<tr>";
        html += "<td>" + parcela.data_vencimento + "</td>";
        html += "<td>R$ " + parcela.valor_parcela.toFixed(2).replace(".", ",") + "</td>";
        html += "<td style='text-align:center;'><button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'></button></td>";
        html += "</tr>";
        tbody.append(html);
    });
}

Ou enviar via Fetch API

 

function gerarParcelas() {
    var dataInicial = document.getElementById("dtaentr").value;
    var intervalos = document.getElementById("formaPgto").value;
    var valorTotal = document.getElementById("vlrtotal").value;

    var dados = {
        dataInicial: dataInicial,
        intervalos: intervalos,
        valorTotal: valorTotal
    };

    fetch('gerar_parcelas.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(dados)
    })
    .then(response => response.json())
    .then(parcelas => {
        mostrarParcelas(parcelas);
    })
    .catch(error => {
        console.log("Erro: ", error);
    });
}

function mostrarParcelas(parcelas) {
    var tbody = document.querySelector("#tbparcs tbody");
    tbody.innerHTML = '';

    parcelas.forEach(function(parcela) {
        var html = "<tr>";
        html += "<td>" + parcela.data_vencimento + "</td>";
        html += "<td>R$ " + parcela.valor_parcela.toFixed(2).replace(".", ",") + "</td>";
        html += "<td style='text-align:center;'><button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'></button></td>";
        html += "</tr>";
        tbody.innerHTML += html;
    });
}

 

retornar dados com JSON

 

<?php
// Recebe o JSON enviado pelo AJAX
$data = json_decode(file_get_contents('php://input'), true);

$dataInicial = new DateTime($data['dataInicial']);
$intervalos = explode("/", $data['intervalos']);
$valorTotal = floatval($data['valorTotal']);

function gerarParcelas($dataInicial, $intervalos, $valorTotal) {
    $datasParcelas = [];
    $quantidadeParcelas = count($intervalos);
    $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100;
    $somaParcelas = 0;

    for ($i = 0; $i < $quantidadeParcelas; $i++) {
        if ($i == $quantidadeParcelas - 1) {
            $valorParcelaAtual = $valorTotal - $somaParcelas;
        } else {
            $valorParcelaAtual = $valorParcela;
        }
        $somaParcelas += $valorParcelaAtual;

        $dataVencimento = clone $dataInicial;
        $dataVencimento->modify("+{$intervalos[$i]} days");

        $datasParcelas[] = [
            'data_vencimento' => $dataVencimento->format('Y-m-d'),
            'valor_parcela' => $valorParcelaAtual
        ];
    }

    return $datasParcelas;
}

$parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal);

echo json_encode($parcelas);
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.