Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rafael Rodrigues

Somar Valores de Acordo a Data

Recommended Posts

Olá mestres,


Estou desenvolvendo um sistema para uma empresa de cobranças, porém estou quebrando com a cabeça em uma parte.

Os clientes irão enviar as notas em um painel que já está pronto, porém ele irá cadastrar essas notas através de um formulário que os inputs deverá ser preenchido de acordo com as informações a serem digitadas.


Ex.:

As notas vencidas em até 1 ano (365 dias) será cobrado: 10%

As notas vencidas de 2 a 3 anos (entre 366 dias e 730 dias) será cobrado: 15%

As notas vencidas até 4 anos (entre 731 dias e 1460 dias) será cobrado: 25%

As notas vencidas acima disso (acima de 1461 dias): será cobrado: 35%


No input 1 será fornecido o valor da nota.

No input 2 será fornecido a data de vencimento da nota.

No input 3 terá que diminuir automaticamente a porcentagem de acordo com a data de vencimento da nota.


Consegui um código que me dá apenas a diferença de dias.




<?php


// Datas a serem criadas
$data_inicial = \DateTime::createFromFormat('Y-m-d', '2012-12-19');
$data_final = \DateTime::createFromFormat('Y-m-d', date('Y-m-d'));


// Calcula diferença entre as datas
$diferenca = $data_final->diff($data_inicial);


// Exibicao da diferença
echo 'Diferenca em meses -> ' . $diferenca->format("%Y anos %m meses %d dias!");
echo '<br />';
echo 'Diferenca em dias -> ' . $diferenca->format("%a dias!");


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você ja tem a diferença de dias, basta jogar isso no if :D

 
if(($diferenca > 0) && ($diferenca < 364)){
        $multa = $valor*0.1;
}
else if(($diferenca > 365) && ($diferenca >731)){
        $multa = $valor*0.15;
}
else if(($diferenca > 370) && ($diferenca >1461)){
        $multa = $valor*0.25;
}
else if($diferenca > 1460){
        $multa = $valor*0.35;
}
else{
        echo "não tem multa :D";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo Ruan, obrigado pela dica!

Utilizei o if que me apresentou, porém está retornando esse erro:

 

Object of class DateInterval could not be converted to int.

 

Então resolvi acrescentar uma pequena coisa, criei uma variável "$dias" para recuperar apenas o total de dias para fazer o calculo.

Porém não está me retornando o valor da multa, ou seja, só está me retornado o valor 15

 

<?php


// Criacao das datas
$data_inicial = \DateTime::createFromFormat('Y-m-d', '2009-12-19');
$data_final   = \DateTime::createFromFormat('Y-m-d', date('Y-m-d'));


// Calculo da diferenca entre as datas
$diferenca = $data_final->diff($data_inicial);


$dias = $diferenca->format("%a"); // Irá recuperar apenas os dias


$valor = 100; // Valor usado para teste.


// Exibicao da diferenca
if(($dias > 0) && ($dias < 364)){
         $multa = $valor*0.1;
echo $multa;
}
else if(($dias > 365) && ($dias >731)){
$multa = $valor*0.15;
echo $multa;
}
else if(($dias > 370) && ($dias >1461)){
  $multa = $valor*0.25;
  echo $multa;
}
else if($dias > 1460){
  $multa = $valor*0.35;
  echo $multa;
}
else{
echo "não tem multa :D";
}


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está ai

// Datas a serem criadas
$data_inicial = DateTime::createFromFormat('Y-m-d', '2012-12-19');
$data_final   = DateTime::createFromFormat('Y-m-d', date('Y-m-d'));
$valor  = '1500.00';
$multa = 0;

// Calcula diferença entre as datas
$diferenca = $data_final->diff($data_inicial);



// Exibicao da diferença
echo 'Diferenca em meses -> ' . $diferenca->format("%Y anos %m meses %d dias!");
echo '<br />';
echo 'Diferenca em dias  -> ' . $diferenca->format("%a dias!");
$diferenca_data =  $diferenca->format("%a");


if(($diferenca_data > 0) && ($diferenca_data < 364)){
        $multa = $valor*0.1;
}
else if(($diferenca_data > 365) && ($diferenca_data >731)){
       
        $multa = $valor*0.15;
}
else if(($diferenca_data > 370) && ($diferenca_data >1461)){
        $multa = $valor*0.25;
}
else if($diferenca_data > 1460){
        $multa = $valor*0.35;
}
else{
        echo "não tem multa :D";
}

echo "<br> - Multa: de: ".$multa;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Leandro, obrigado pela resposta.

 

Mas infelizmente ainda não está recuperando os valores corretamente. :(

 

As notas com 1 ano, não me retorna nenhum valor.

As notas com 2 anos também não me retorna nenhum valor.

As notas com 3 anos já me retorna um valor de 255.

As notas de 4 anos me retorna o mesmo valor de 255.

As notas acima de 5 anos está me retornando também 255.

 

 

Ex.: Temos o valor de R$ 1500,00 então teremos que obter os seguintes valores:

 

Notas com um ano (0 a 365 dias)

10% = 150

 

Notas de dois a três anos (entre 366 e 1095 dias)

15% = 225

 

Notas com quatro anos (entre 1096 e 1825 dias)

25% = 375

 

Notas com cinco anos (acima de 1826 dias)

35% = 525

 

Segue o código testado:

 

<?php


// Datas a serem criadas
$data_inicial = DateTime::createFromFormat('Y-m-d', '2014-10-29');
$data_final   = DateTime::createFromFormat('Y-m-d', date('Y-m-d'));
$valor  = '1500.00';
$multa = 0;


// Calcula diferença entre as datas
$diferenca = $data_final->diff($data_inicial);




// Exibicao da diferença
echo 'Diferenca em meses -> ' . $diferenca->format("%Y anos %m meses %d dias!");
echo '<br />';
echo 'Diferenca em dias  -> ' . $diferenca->format("%a dias!");
$diferenca_data =  $diferenca->format("%a");


if(($diferenca_data > 0) && ($diferenca_data < 364)){
        $multa = $valor*0.1;
}
else if(($diferenca_data > 365) && ($diferenca_data >731)){
       
        $multa = $valor*0.15;
}
else if(($diferenca_data > 370) && ($diferenca_data >1461)){
        $multa = $valor*0.25;
}
else if($diferenca_data > 1460){
        $multa = $valor*0.35;
}
else{
        echo "Não tem multa :D";
}


echo "<br> - Multa de: ".$multa;
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora é detalhe que vc precisa acertar, repare que o primeiro if está se menor 364 ou seja, nem é um ano.

 

Leia o código que a resposta está no detalhe.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Corrigi os if, porém ainda não retorna.

 

//DATA COM 1 ANO
if(($diferenca_data > 0) && ($diferenca_data < 365)){
        $multa = $valor*0.1;
}
//DATA DE 2 A 3 ANOS
else if(($diferenca_data > 366) && ($diferenca_data >1095)){
       
        $multa = $valor*0.15;
}
//DATA DE 4 ANOS
else if(($diferenca_data > 1096) && ($diferenca_data >1460)){
        $multa = $valor*0.25;
}
//DATA ACIMA DE 5 ANOS
else if($diferenca_data > 1461){
        $multa = $valor*0.35;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria assim?

//DATA COM 1 ANO
if(($diferenca_data > 0) && ($diferenca_data < 365)){
        $multa = $valor*0.1;
}
//DATA DE 2 A 3 ANOS
else if(($diferenca_data > 366) && ($diferenca_data < 1095)){
       
        $multa = $valor*0.15;
}
//DATA DE 4 ANOS
else if(($diferenca_data > 1096) && ($diferenca_data < 1460)){
        $multa = $valor*0.25;
}
//DATA ACIMA DE 5 ANOS
else if($diferenca_data > 1461){
        $multa = $valor*0.35;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, consegui fazer pegar o valor, porém a minha dúvida é o preenchimento automático desse valor no input. :D

<?php


// Datas a serem criadas
$data_inicial = DateTime::createFromFormat('Y-m-d', $_POST['vencimento']);
$data_final   = DateTime::createFromFormat('Y-m-d', date('Y-m-d'));
$valor  = $_POST['valor_nota']; // Irá pegar o valor vindo do formulário.
$multa = 0;


// Calcula diferença entre as datas
$diferenca = $data_final->diff($data_inicial);



// Exibicao da diferença
$dias =  $diferenca->format("%a");

if(($dias > 0) && ($dias <= 365)){
   $multa = $valor * 0.1;
}else if(($dias > 365) && ($dias <= 730)){
   $multa = $valor * 0.15;
}else if(($dias > 730) && ($dias <= 1460)){
   $multa = $valor * 0.25;
}else if($dias > 1460){
   $multa = $valor * 0.35;
}else{
   $multa = 0;
}
echo $multa;
?>

Aqui está o formulário que envia os valores:

<html>
<head>
  <meta charset="UTF-8">
  <title>Pega Valores</title>
</head>
<body>
<form action="" method="post">
    Valor da Nota: <input type="text" name="valor_nota" id="valor_nota" />
    Vencimento: <input type="date" name="vencimento" id="vencimento" />
    Total: <input type="text" name="total" id="total" readonly="readonly" />
</body>
</html> 

Tenho um código em javascript que acho que irá ser útil, porém não sei como adapta-lo para receber o valor de acordo o preenchimento:

<script type="text/javascript">
function id(el) {
  return document.getElementById( el );
}
function total( un, qnt ) {
  return parseFloat(un.replace(',', '.'), 10) * parseFloat(qnt.replace(',', '.'), 10);
}
window.onload = function() {
  id('valor_unitario').addEventListener('keyup', function() {
    var result = total( this.value , id('qnt').value );
    id('total').value = String(result.toFixed(2)).formatMoney();
  });

  id('qnt').addEventListener('keyup', function(){
    var result = total( id('valor_unitario').value , this.value );
    id('total').value = String(result.toFixed(2)).formatMoney();
  });
}

String.prototype.formatMoney = function() {
  var v = this;

  if(v.indexOf('.') === -1) {
    v = v.replace(/([\d]+)/, "$1,00");
  }

  v = v.replace(/([\d]+)\.([\d]{1})$/, "$1,$20");
  v = v.replace(/([\d]+)\.([\d]{2})$/, "$1,$2");
  v = v.replace(/([\d]+)([\d]{3}),([\d]{2})$/, "$1.$2,$3");

  return v;
};
</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código original dese javascript é:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="../gh-fork-ribbon.css" />
</head>
<body>
  <form action="" method="post">
    Valor Unitário: <input type="text" name="valor_unitario" id="valor_unitario" />
    Quantidade: <input type="text" name="qnt" id="qnt" value="0" />
    Total: <input type="text" name="total" id="total" readonly="readonly" />
  </form>

<script type="text/javascript">
function id(el) {
  return document.getElementById( el );
}
function total( un, qnt ) {
  return parseFloat(un.replace(',', '.'), 10) * parseFloat(qnt.replace(',', '.'), 10);
}
window.onload = function() {
  id('valor_unitario').addEventListener('keyup', function() {
    var result = total( this.value , id('qnt').value );
    id('total').value = String(result.toFixed(2)).formatMoney();
  });

  id('qnt').addEventListener('keyup', function(){
    var result = total( id('valor_unitario').value , this.value );
    id('total').value = String(result.toFixed(2)).formatMoney();
  });
}

String.prototype.formatMoney = function() {
  var v = this;

  if(v.indexOf('.') === -1) {
    v = v.replace(/([\d]+)/, "$1,00");
  }

  v = v.replace(/([\d]+)\.([\d]{1})$/, "$1,$20");
  v = v.replace(/([\d]+)\.([\d]{2})$/, "$1,$2");
  v = v.replace(/([\d]+)([\d]{3}),([\d]{2})$/, "$1.$2,$3");

  return v;
};
</script>


</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você quer colocar o valor que encontrou la naquela condição dentro do formulário? Basta dar um echo no atributo value=" " dos inputs com a variável que contém cada valor :D

$dias = $diferenca->format("%a");

if(($dias > 0) && ($dias <= 365)){
    $multa = $valor * 0.1;
}
else if(($dias > 365) && ($dias <= 730)){
    $multa = $valor * 0.15;
else if(($dias > 730) && ($dias <= 1460)){
    $multa = $valor * 0.25;
}
else if($dias > 1460){
    $multa = $valor * 0.35;
}
else{
    $multa = 0;
}
echo "Valor dedivo: <input type='text' value=' ".$valor." '/>";
echo "Valor da Multa: <input type='text' value=' ".$multa." '/>";
echo "Valor Total: <input type='text' value=' ".$multa+$valor." '/>";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites
Olá Ruan, o que eu quero é ao cadastrar a nota os inputs irem preenchendo automaticamente, de acordo com o valor passado por cada input.

Tipo assim:


1º O input 1 a pessoa digita o valor;

2º O input 2 a pessoa informa a data de vencimento;

3º O input 3 vai ser preenchido automaticamente de acordo com as informações.


Esse procedimento de preencher automaticamente acho que tem ser em Javascript.

Vai ser tipo aquele modelo que mostrei anteriormente!


Porém ainda não sei como implementar um código do PHP no Javascript.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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