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 luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • 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
       
×

Informação importante

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