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.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

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