segunda-feira, 11 de junho de 2012

Gerar Mensalidades com PHP

Para quem estava interessado no exemplo para download, clique aqui, mas lembrando que está em PDO.


Este Script mostra como gerar parcelas para seu sistema.  Por exemplo:
Um sistema de cadastro de aluno, onde o mesmo pagará 3 parcelas do seu curso,
1ª parcela | 01/05/2012 | R$ 50,00
2ª parcela | 01/06/2012 | R$ 50,00
3ª parcela | 01/07/2012 | R$ 50,00
[...] e assim por diante.
Confira o código abaixo, que salva os dados no banco de dados e também mostra o que foi gravado no banco em forma de tabela.
Crie uma tabela com o nome mensalidades e adicione os seguintes campos a ela
valor_mens(double), data_mens(date), num_mens(varchar)

 <?php  
 include "config.php"; //inclue seu arquivo de conexão com banco de dados   
   $valor       = 50; //Valor da parcela  
   $parcelas     = 10; //Número de parcelas  
   $datapagamento1  = "2012-06-25"; //Data do primeiro pagamento  
   $diavencimento   = 10; //Dia de vencimento das parcelas  
   $gravadata     = $datapagamento1;    
   echo '<table border="1">';  
     echo "<tr>";   
       echo "<td>Parcela</td>";    
       echo "<td>Vencimento</td>";        
     echo "</tr>";      
   for ($i = 1; $i <= $parcelas; $i++){      
     //Parcela  
     $parcela = $i."a"; //grava o número da parcela assim: 1a, 2a, 3a, etc...  
     echo "<tr>";  
       echo "<td>";  
         echo $parcela;  
       echo "</td>";      
     //Vencimento      
       echo "<td>";  
         echo $gravadata;  
       echo "</td>";      
     echo "</tr>";  
     if (!empty($diavencimento)){ //Se o dia de vencimento não tiver em branco  
       $dia = $diavencimento; //o dia será igual ao dia de vencimento  
     }else{  
       $dia = date("d",strtotime($gravadata)); //se o dia de vencimento tiver em branco, então o dia será igual ao dia da data de vencimento  
     }  
     $mes = date("m",strtotime($gravadata)) + 1;  
     $ano = date("Y",strtotime($gravadata));  
     $sql = mysql_query("INSERT INTO mensalidades (valor_mens, data_mens, num_mens) VALUES ('$valor', '$gravadata', '$parcela')");  
       if ($mes == 13) { //se passar do mês 12, então inicia com o mes 1 do próximo ano  
       $mes = 1;  
       $ano = $ano + 1;    
     }  
     if ($dia == 30 && $mes == 2){ //fevereiro não pode ter 30 dias não é. kkk  
       $gravadata = $ano."-".$mes."-28";  
     }else{  
       $gravadata = $ano."-".$mes."-".$dia;  
     }  
   }  
   echo "</table>";  
   if ($sql) {  
       echo "Mensalidades inseridas com sucesso.";    
     }else{  
       echo "Erro ao inserir mensalidades.";    
     }  
   ?> 

Em PDO Seria Assim:

1 - Crie uma pasta dentro da raiz do seu projeto com o nome "classes" e dentro dessa pasta crie um arquivo com o nome "BD.class.php". Segue código desse arquivo:
 <?php  
 class BD {  
   private static $conn;  
   private function __construct() {  
   }  
   public static function getConn() {  
     try {  
       if (is_null(self::$conn)) {  
         self::$conn = new PDO(DSN, USER, PASS);  
       }  
       return self::$conn;  
     } catch (Exception $e) {  
       echo '<div class="alertErro">' . $e->getMessage() . '</div>';  
     }  
   }  
 }  


2 -  Crie uma pasta chamado "config" dentro da raiz do seu projeto e dentro dessa pasta, inclua os seguintes arquivos "config.php, define.php e load.php", segue código de cada arquivo.

config.php

<?php

include ('config/define.php');
include ('config/load.php');

define.php

<?php

define('HOST', 'localhost'); // Host
define('USER', 'root'); // Usuário
define('PASS', ''); //Senha
define('BD', 'banco'); //Nome do banco de dados
define('DSN', 'mysql:host=' . HOST . ';dbname=' . BD);

load.php


<?php

function __autoload($classe) {
    $pagina = sprintf('classes/%s.class.php', $classe);
    if (file_exists($pagina)) {
        include ($pagina);
    } else {
        echo '<div class="AlertErro">Arquivo não existe</div>';
    }
}
3 - E finalmente o código para gerar as parcelas e salvá-las no banco. 
Este é o código SQL para criar a tabela.

CREATE TABLE `mensalidades` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `valor_mens` double DEFAULT NULL,
  `data_mens` date DEFAULT NULL,
  `num_mens` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
E para gerar as mensalidades use este código em qualquer arquivo dentro da sua pasta raiz.

<?php
include "config/config.php"; //inclue seu arquivo de conexão com banco de dados 
$valor = $_POST['valor'];
$parcelas = $_POST['parcelas'];
$datapagamento1 = implode(!strstr($_POST['datapagamento1'], '/') ? "/" : "-", array_reverse(explode(!strstr($_POST['datapagamento1'], '/') ? "-" : "/", $_POST['datapagamento1']))); //Esta rotina é para converter a data do formato brasileiro para o americano
$diavencimento = $_POST['vencimento'];
$gravadata = $datapagamento1;
$sql = "INSERT INTO mensalidades (valor_mens, data_mens, num_mens) VALUES ";
echo '<table border="1">';
echo "<tr>";
echo "<td>Parcela</td>";
echo "<td>Valor</td>";
echo "<td>Vencimento</td>";
echo "</tr>";
for ($i = 1; $i <= $parcelas; $i++) {
    //Parcela
    $parcela = $i . "a"; //grava o número da parcela assim: 1a, 2a, 3a, etc...
    echo "<tr>";
    echo "<td>";
    echo $parcela;
    echo "</td>";
    //Valor
    echo "<td>";
    echo $valor;
    echo "</td>";
    //Vencimento        
    echo "<td>";
    echo implode(!strstr($gravadata, '-') ? "-" : "/", array_reverse(explode(!strstr($gravadata, '-') ? "/" : "-", $gravadata))); //Muda para o formato brasileiro
    echo "</td>";
    echo "</tr>";

    if (!empty($diavencimento)) { //Se o dia de vencimento não tiver em branco
        $dia = $diavencimento; //o dia será igual ao dia de vencimento
    } else {
        $dia = date("d", strtotime($gravadata)); //se o dia de vencimento tiver em branco, então o dia será igual ao dia da data de vencimento
    }

    $mes = date("m", strtotime($gravadata)) + 1;
    $ano = date("Y", strtotime($gravadata));

    $sql .= "(" . $valor . ", '" . $gravadata . "', '" . $parcela . "'),";

    if ($mes == 13) { //se passar do mês 12, então inicia com o mes 1 do próximo ano
        $mes = 1;
        $ano = $ano + 1;
    }

    if ($dia == 30 && $mes == 2) { //fevereiro não pode ter 30 dias não é. kkk
        $gravadata = $ano . "-" . $mes . "-28";
    } else {
        $gravadata = $ano . "-" . $mes . "-" . $dia;
    }
}

echo "</table>";

//Remove a última vírgula da string SQL
$sql = substr($sql, 0, -1);
//Salva no banco
try {
    echo "<p>String SQL: $sql</p>";
    $stmt = BD::getConn()->prepare($sql);
    if ($stmt->execute()):
        echo "Mensalidades inseridas com sucesso.";
    else:
        echo "Erro ao inserir!";
    endif;
} catch (Exception $e) {
    echo 'ERROR: ', $e->getMessage(), "\n";
}

19 comentários:

  1. muito bom. estava precisando desse codigo, e funcionando perfeitamente.
    parabens

    ResponderExcluir
  2. Mês de fevereiro não tá funcionando!

    ResponderExcluir
  3. tem como zipar o arquivo completo e postar ?

    ResponderExcluir
  4. Amigo estou atualizando os posts e a interface do blog, se quiser deixe seu email q mando o script e se preferir mando em PDO

    ResponderExcluir
  5. marcotuliomtb@hotmail.com, se tiver como mandar o arquivo zipado agradeco

    ResponderExcluir
    Respostas
    1. Sem problemas amigo, vou postar um novo post aqui mesmo em PDO, tudo bem? Vou fazer agora mesmo!

      Excluir
  6. perfeito, belo trabalho com o fevereiro.

    ResponderExcluir

  7. Amigo teria como vc me enviar os arquivos do script.

    Poderia enviar para meu e-mail: jrrocha@outlook.com.br

    Desde Já te agradeço a atenção...

    Obrigado!

    ResponderExcluir
  8. Poderia mandar esse script para meu email: sistemacalango@gmail.com
    Valeu!!!
    Agradeço Antecipadamente

    ResponderExcluir
  9. Amigo você poderia também me enviar por favor wesleymendonca@outlook.com.

    Obrigado

    ResponderExcluir
  10. Qual é o seu Email Walinson? O meu Banco ta gravando a Data no padrão americano.

    ResponderExcluir
    Respostas
    1. Kayo o mysql sempre salva a data no formato americado, esse é o correto. Agora se você tá passando uma data no formatado brasileiro, voce deve converte-la para o formato americano quando for fazer a inserção no banco. Para converter voce pode usar por exemplo: $dataus = date('Y-m-d',strtotime($suadataemptbr));
      ou também você pode usar: $dataus = join('-', array_reverse(explode('/', $suadataemptbr)));

      Excluir
  11. Excelente post! Fiz algumas alterações adaptando para as minhas necessidades e funcionou perfeitamente. Parabéns!!!

    ResponderExcluir
    Respostas
    1. Obrigado Marcio, esse post é bem antigo e certamente hoje teria soluções bem mais simples, mas fico feliz em saber que resolveu seu problema.

      Excluir
  12. Bom dia tem como Manda no meu Email carloshenriquejr1987@hotmail.com script em mensalidade em pdo

    ResponderExcluir
  13. Olá. Parabéns pelo belo trabalho.
    Se ao invés de colocar vencimento fixo, eu desejasse informar um intervalo?
    Tipo 30, 45 dias ou 7, 21, 35 dias?
    Poderia dar um norte?

    ResponderExcluir