Ir para conteúdo
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.
       
      Estou com uma dúvida e não consigo entender, fiz várias pesquisas e tentativas antes de recorrer aos amigos.

      Tenho uma CLASS e quando chamo dentro de um CONTROLLER o sistema acusa que não acha o caminho da CLASS.
      Como consigo fazer para o sistema localizar/chamar a CLASS dentro do Controller ?

      a classe está assim:
       
      <?php namespace Servicos; use NFePHP\NFe\Make; use NFePHP\NFe\Tools; error_reporting(E_ALL); ini_set('display_errors', 'On'); class NFeServicos{ public function __construct($config, $empresas){ //codes... } }  
      Controller:
       
      <?php defined('BASEPATH') OR exit('No direct script access allowed'); use NFePHP\Common\Certificate; use NFePHP\DA\NFe\Danfe; use Servicos\NFeServico; //chamo a class class NotaFiscal extends CI_Controller { public function gerarXml() { $id = $this->input->post('idLct'); $this->load->model('estoque/lancamentos_model', '', true); $venda = $this->lancamentos_model->getById($id); $nfe = new NFeServico(); //<o erro acontece aqui, não localiza. } }  
       
      Grato,
       
      Cesar
    • Por belann
      Olá!
       
      Não estou conseguindo criar um projeto laravel está dando o seguinte erro: 
      In Factory.php line 654:
        The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl ex
        tension, you can disable this error, at your own risk, by setting the 'disable-tls' option to true.
       
      Já baixei a versão openssl 3.3.1 e instalei no diretório ext do php, mas não sei se tem que configurar alguma coisa no php.ini.
       
    • Por violin101
      Caros amigos,  saudações. 
       
      Primeiramente agradeço ao auxílio e ajuda que os amigos têm me dado. 
       
      Minha dúvida:
      - para emissão de nota fiscal eletrônica precisa de um CERTIFICADO e SENHA.
      Como ou onde consigo esses dois itens, para fazer teste de emissão de nota fiscal  ?
       
      Grato, 
       
      Cesar
    • Por violin101
      Caros amigos,  saudações. 
       
      Primeiramente agradeço ao auxílio e ajuda que os amigos têm me dado. 
       
      Minha dúvida:
      - para emissão de nota fiscal eletrônica precisa de um CERTIFICADO e SENHA.
      Como ou onde consigo esses dois itens, para fazer teste de emissão de nota fiscal  ?
       
      Grato, 
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma pequena dúvida.
       
      Estou escrevendo um Sistema que tem vários Módulos.
       
      O módulo principal tem:
      Estoque | Compras | Expedição | Vendas

      Minha dúvida:
      como faço após Acessar o Módulo Principal e Escolher o Módulo que quero trabalhar,
      eu possa fechar o Módulo aberto por exemplo: Estoque, sem alterar o Módulo principal e outros se estiver aberto ?


      Grato,
       
      Cesar
×

Informação importante

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