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 de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Desculpa postar minha dúvida, fiz várias pesquisa mas não tive sucesso.
       
      Como faço para capturar o ID do SELECT selecionado e passar para base_url ?
       
      Exemplo:
      após selecionar o ID passar para <?php echo base_url();?>estoque/ajuste/adicionar/ <== passar o ID aqui.
       
      <div class="col-md-6"> <label for="tipoDepart" class="control-label">Departamento:</label> <select name="tipoDepart" id="tipoDepart" style="width:100%;" class="form-control"> <option value="">Selecione um Departamento</option> <?php foreach ($dprts as $dp) { echo '<option value="'.$dp->idDepartamento.'">'.$dp->departamento.'</option>'; } ?> </select> </div> <div class="col-md-6"> <div class="card card-entrad"> <div class="card-header"> <label class="card-tlentr">Entrada - Estoque</label> </div> <div class="card-body"> <div style="text-align:center;"> <a href="<?php echo base_url();?>estoque/ajuste/adicionar/" <== COMO PASSO O ID SELECIONADO AQUI, PARA ABRIR A PÁGINA COM O ID DO DPTO ? class="btn btn-cinza">Adicionar</a> </div> </div> </div> </div>  
      Observação: preciso capturar e passar o ID para gerar TABELA referente a cada departamento.
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Tem como passar para o Formulário um Campo vindo via AJAX no formato moeda ?
       
      Tenho uma rotina onde o usuário escolhe através de uma Lista na modal de Produtos e o sistema informa o formulário os seguintes campos:
      código | descrição | espécie | estoque atual.
       
      o estoque atual preciso passar nesse formato, para validação de quantidade: 15.00 ou 15,00.
      ou seja:
      converter de: 15 
      para: 15.00 com casas decimais

      tem como fazer isso ?
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Tem como passar para o Formulário um Campo vindo via AJAX no formato moeda ?
       
      Tenho uma rotina onde o usuário escolhe através de uma Lista na modal de Produtos e o sistema informa o formulário os seguintes campos:
      código | descrição | espécie | estoque atual.
       
      o estoque atual preciso passar nesse formato, para validação de quantidade: 15.00 ou 15,00.

      tem como fazer isso ?
       
      Grato,
       
      Cesar
×

Informação importante

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