<?php
function ultimoDiaMesSequinte($ref){
    $dia  = 1;
    $mes  = substr($ref,0,2);
    $ano  = substr($ref,3,4);
    $data = mktime(0, 0, 0, $mes+2, $dia, $ano);
    return date("Y-m-d",$data-1);
  }

  function fator_vencimento($data) {
    // Define os valores a serem usados
	$data_inicial = '1997-10-07';
	$data_final   = $data;

	// Usa a função strtotime() e pega o timestamp das duas datas:
	$time_inicial = strtotime($data_inicial);
	$time_final = strtotime($data_final);

	// Calcula a diferença de segundos entre as duas datas:
	$diferenca = $time_final - $time_inicial; // 19522800 segundos

	// Calcula a diferença de dias
	$dias = (int)floor( $diferenca / (60 * 60 * 24)); // 225 dias
    return $dias;
  }

  function modulo_11($num, $base=9, $r=0) {
    $soma  = 0;
    $fator = 2;
    /* Separacao dos numeros */
    for ($i = strlen($num); $i > 0; $i--) {

    // pega cada numero isoladamente
      $numeros[$i] = substr($num,$i-1,1);
    // Efetua multiplicacao do numero pelo falor
      $parcial[$i] = $numeros[$i] * $fator;
    // Soma dos digitos
      $soma += $parcial[$i];
      if ($fator == $base) {
       // restaura fator de multiplicacao para 2
         $fator = 1;
      }
      $fator++;
    }

    /* Calculo do modulo 11 */
    if ($r == 0) {
      $soma *= 10;
      $digito = $soma % 11;
      if ($digito == 10) {
        $digito = 0;
      }
      return $digito;
    } elseif ($r == 1){
      $resto = 11- ($soma % 11);
      return $resto;
      }
  }

  function modulo_10($num) {
    $numtotal10 = 0;
    $fator = 2;

    // Separacao dos numeros
    for ($i = strlen($num); $i > 0; $i--) {

      // pega cada numero isoladamente
      $numeros[$i] = substr($num,$i-1,1);
      // Efetua multiplicacao do numero pelo (falor 10)
      // 2002-07-07 01:33:34 Macete para adequar ao Mod10 do Itaú
      $temp = $numeros[$i] * $fator;
      $temp0=0;
      foreach (preg_split('//',$temp,-1,PREG_SPLIT_NO_EMPTY) as $k=>$v){ $temp0+=$v; }
      $parcial10[$i] = $temp0; //$numeros[$i] * $fator;
      // monta sequencia para soma dos digitos no (modulo 10)
      $numtotal10 += $parcial10[$i];
      if ($fator == 2) {
        $fator = 1;
      } else {
        $fator = 2; // intercala fator de multiplicacao (modulo 10)
        }
    }
    // várias linhas removidas, vide função original
    // Calculo do modulo 10
    $resto = $numtotal10 % 10;
    $digito = 10 - $resto;
    if ($resto == 0) {
      $digito = 0;
    }
    return $digito;
}

  function geraLinhaDigitavel($valor) {
    $a =  substr($valor,0,4).substr($valor,19,2).substr($valor,21,3).modulo_10(substr($valor,0,4).substr($valor,19,2).substr($valor,21,3));
    $b =  substr($valor,24,2).substr($valor,26,1).substr($valor,27,1).substr($valor,28,2).substr($valor,30,4).modulo_10(substr($valor,24,2).substr($valor,26,1).substr($valor,27,1).substr($valor,28,2).substr($valor,30,4));
    $c =  substr($valor,34,8).substr($valor,42,2).modulo_10(substr($valor,34,8).substr($valor,42,2));
    $d =  substr($valor,4,1);
    $e =  substr($valor,5,4).substr($valor,9,10);
    return substr($a,0,5).".".substr($a,5,5)." ".substr($b,0,5).".".substr($b,5,6)." ".substr($c,0,5).".".substr($c,5,6)." ".$d." ".$e;
  }
?>