Function to duplicate maturities in n parcels?

4

I am having problems creating a function to duplicate the maturities, my scenario is as follows, I want to pass to the function 3 variants, being theTotal value, QtyParcels and firstVerification and if there is more than one parcel an array is created informing the next maturities as the function I'm trying to develop follows.

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 point out another way to solve this problem? Thank you.

    
asked by anonymous 09.01.2017 / 17:10

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;
}

Usage:

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

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

Result:

  

array (2) {

     

["data"] = >

     

array (2) {

[0]=>

string(10) "2016-12-15"

[1]=>

string(10) "2017-01-14"
     

}

     

["value"] = >

     

array (2) {

[0]=>

float(100)

[1]=>

float(100)
     

}

     

}

    
09.01.2017 / 17:37
2

For the initial question, it seemed to me that your $ValorTotal variable has no use within the function, so I left only the calculation of dates, which is simpler. It would also be interesting to have the amount 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 needs to understand the criteria you will use. Need to care for cents because the sum of the installments should be equal to the total amount and so you can not make a simple split of Total / Quantidade . When this happens one of the parcels will also be of greater value and you need to have a criterion to decide whether it will be the first or last parcel.

    
09.01.2017 / 17:49
2

Here is my solution using the DateTime and DateInterval classes

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)
}
    
09.01.2017 / 18:05