Function to double salaries in n installments?

Asked

Viewed 137 times

4

I’m having trouble creating a function to duplicate pay, my scenario is this, I want to move to function 3 variables, being the valueTotal, qtyParcelas and firstVencing and if there is more than one portion an array is created informing the next maturities as follows the function I am trying to develop.

function DesdobraParcelas($ValorTotal, $QtdeParcelas, $DataPrimeira){
if ($QtdeParcelas > 1){
    //se a quantidade parcelas for maior que 1 declaro o array e informo a data do primeiro vencimento
    $array = array();
    $array[] = $DataPrimeira;
       for($i = 1; $i <= $QtdeParcelas; $i++){ 
       //agora dentro do array queri inserir os próximos vencimentos     incrementando de 30 em 30 dias
       $array[] =  $array[] + date('Y-m-d', strtotime('+30 days', strtotime($array[$i-1])));
       }
} else {
    //caso haja apenas uma parcela a mesma é inserida no array e retornada
    $array[] = $DataPrimeira;
}
return $array; }
print_r(DesdobraParcelas(200.00, 2, '2016-12-15'));

Could you help me or find another way to solve this problem? thank you.

  • which is appearing?

3 answers

3


I made some adjustments:

Function:

function DesdobraParcelas($ValorTotal, $QtdeParcelas, $DataPrimeira) {
    if ($QtdeParcelas > 1) {
        //se a quantidade parcelas for maior que 1 declaro o array e informo a data do primeiro vencimento
        $array = array();
        $val_parcela = $ValorTotal / $QtdeParcelas; // calcula o valor da parcela
             
        $array['data'][] = date('Y-m-d', strtotime($DataPrimeira));
        $array['valor'][] = $val_parcela;
        
        
        for ($i = 1; $i < $QtdeParcelas; $i++) {
            //agora dentro do array queri inserir os próximos vencimentos     incrementando de 30 em 30 dias
            $array['data'][] = date('Y-m-d', strtotime('+30 days', strtotime($array['data'][$i - 1])));
            $array['valor'][] = $val_parcela;
        }
    } else {
        //caso haja apenas uma parcela a mesma é inserida no array e retornada
        $array[] = $DataPrimeira;
        $array['valor'][] = $ValorTotal;
    }
    
    
    
    return $array;
}

Utilizing:

$resultado = DesdobraParcelas(200.00, 2, '2016-12-15');

echo '<pre>';
var_dump($resultado);
echo '</pre>';

Upshot:

array(2) {

["date"]=>

array(2) {

[0]=>

string(10) "2016-12-15"

[1]=>

string(10) "2017-01-14"

}

["value"]=>

array(2) {

[0]=>

float(100)

[1]=>

float(100)

}

}

  • Thank you @Allanandrade was exactly what I needed including the values.

2

From the initial question, it seemed to me that your variable $ValorTotal it has no use within the function, so I left only the calculation of the dates, which is simpler. It would also be interesting to have the number of days as a function parameter.

function DesdobraParcelas($QtdeParcelas, $DataPrimeira) 
{
   $array = array();
   $DataParcela = $DataPrimeira;
   for($i = 0; $i < $QtdeParcelas; $i++) { 
      if ($i > 0) {
          $DataParcela = date('Y-m-d', strtotime('+30 days', $DataParcela));
      }
      $array[] = $DataParcela;
   }
   return $array; 
}

To divide the value into installments is more complicated and you need to understand the criteria you will use. Need to take care of pennies because the sum of the plots should be equal to the total value and so you can not make a simple division of Total / Quantidade. When this happens one of the installments will also be with higher value and you need to have a criterion to decide whether it will be as first or as last installment.

2

Here is my solution using the classes DateTime and DateInterval

function parcelas($total, $quantidadeParcelas, $vencimento)
{
        if ($quantidadeParcelas > 1) {
        $dados = array();

        $valorParcelas = $total / $quantidadeParcelas;
        $pagamento = new DateTime($vencimento);
        $dados[$pagamento->format('d-m-Y')] = $valorParcelas;

        for ($i=1; $i < $quantidadeParcelas; $i++) {
            $dados[$pagamento->add(new DateInterval('P30D'))->format('d/m/Y')] = $valorParcelas;
        }

        return $dados;
    }
}

var_dump(parcelas(100, 3, '09-01-2017'));

array(3) {
  ["09-01-2017"]=>
     float(33.333333333333)
  ["08/02/2017"]=>
     float(33.333333333333)
  ["10/03/2017"]=>
     float(33.333333333333)
}
  • Thanks @Rafaelacioly not yet worked with Dateinterval for your tip I will study the documentation.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.