Ir para conteúdo
Fórum Script Brasil
  • 0

Sistema de Reserva Online


Robson Felix

Pergunta

Boa tarde galera

Com base em um tutorial na internet, estou montando um sistema para verificar disponibilidade de quarto para fazer a reserva online e gostaria de uma ajuda.

O sistema está funcionando em partes, já consigo fazer algumas coisas utilizando o codigo que já tenho, porem falta algumas coisas que explico mais abaixo

CREATE TABLE IF NOT EXISTS `quarto` (
  `quartoID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(40) NOT NULL,
  `descricao` varchar(250) NOT NULL,
  `maxocupacao` smallint(5) unsigned NOT NULL,
  `valor` smallint(5) unsigned NOT NULL,
  `minimo` smallint(5) unsigned NOT NULL,
  `inicio` date NOT NULL,
  `fim` date NOT NULL,
  `quant` varchar(3) NOT NULL,
  PRIMARY KEY (`quartoID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4;


INSERT INTO `quarto` (`quartoID`, `nome`, `descricao`, `maxocupacao`, `valor`, `minimo`, `inicio`, `fim`, `quant`) VALUES
(1, 'STANDARD SOLTEIRO', 'Tarifa de balcão', 1, 110, 2, '2011-06-01', '2011-06-22', '3'),
(2, 'STANDARD DUPLO ', 'Para duas pessoas', 2, 130, 2, '2011-06-01', '2011-06-23', '2'),
(3, 'STANDARD TRIPLO', 'para 3 pessoas', 3, 100, 2, '2011-06-01', '2011-06-23', '2');


CREATE TABLE IF NOT EXISTS `reserva` (
  `resID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `checkin` date NOT NULL,
  `checkout` date NOT NULL,
  `quartoID` int(10) unsigned NOT NULL,
  `hospede` varchar(80) NOT NULL,
  `comentario` varchar(250) NOT NULL,
  PRIMARY KEY (`resID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4;


INSERT INTO `reserva` (`resID`, `checkin`, `checkout`, `quartoID`, `hospede`, `comentario`) VALUES
(1, '2011-06-12', '2011-06-18', 1, 'Teste', 'Teste'),
(2, '2011-06-01', '2011-06-08', 2, 'Robson', 'Teste'),
(3, '2011-06-01', '2011-06-05', 1, 'Testet', 'asdasd');
Página disponibilidade recebe as datas de check-in e check-out separados por dia, mes e ano e quandidade de pessoas Dentro do código abaixo: Recebe data de entrada e saida e calcula quantos dias ($dias_diferenca) Escreve por extenso a data recebida (formata_data_extenso)
<?

$numerodeocupante = $_POST['numerodeocupante'];

$diain = $_POST['arrDate_day'];
$mesin = $_POST['arrDate_mon'];
$anoin = $_POST['arrDate_year'];
$diaout = $_POST['deptDate_day'];
$mesout = $_POST['deptDate_mon'];
$anoout = $_POST['deptDate_year'];
$datain= '"' .$_POST["arrDate_year"] . "-" . $_POST["arrDate_mon"] . "-" . $_POST["arrDate_day"]. '"';
$dataout= '"' .$_POST["deptDate_year"] . "-" . $_POST["deptDate_mon"] . "-" . $_POST["deptDate_day"]. '"';
$datain2= $_POST["arrDate_year"] . "-" . $_POST["arrDate_mon"] . "-" . $_POST["arrDate_day"];
$dataout2= $_POST["deptDate_year"] . "-" . $_POST["deptDate_mon"] . "-" . $_POST["deptDate_day"];


//data check-in
$ano1 = $anoin;
$mes1 = $mesin;
$dia1 = $diain;

//data creck-out
$ano2 = $anoout;
$mes2 = $mesout;
$dia2 = $diaout;

//calculo timestam das duas datas
$timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1);
$timestamp2 = mktime(4,12,0,$mes2,$dia2,$ano2);

//diminuo a uma data a outra
$segundos_diferenca = $timestamp1 - $timestamp2;
//echo $segundos_diferenca;

//converto segundos em dias
$dias_diferenca = $segundos_diferenca / (60 * 60 * 24);

//obtenho o valor absoluto dos dias (tiro o possível sinal negativo)
$dias_diferenca = abs($dias_diferenca);

//tiro os decimais aos dias de diferenca
$dias_diferenca = floor($dias_diferenca);


echo "$datain<br>$dataout<br>$datain2<br>$dataout2<br>$dias_diferenca<br>";

function formata_data_extenso($strDate)
{
        // Array com os dia da semana em português;
        $arrDaysOfWeek = array('Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado');
        // Array com os meses do ano em português;
        $arrMonthsOfYear = array(1 => 'Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro');
        // Descobre o dia da semana
        $intDayOfWeek = date('w',strtotime($strDate));
        // Descobre o dia do mês
        $intDayOfMonth = date('d',strtotime($strDate));
        // Descobre o mês
        $intMonthOfYear = date('n',strtotime($strDate));
        // Descobre o ano
        $intYear = date('Y',strtotime($strDate));
        // Formato a ser retornado
        return $arrDaysOfWeek[$intDayOfWeek] . ', ' . $intDayOfMonth . ' de ' . $arrMonthsOfYear[$intMonthOfYear] . ' de ' . $intYear;
}

echo formata_data_extenso($_POST["arrDate_year"] . "-" . $_POST["arrDate_mon"] . "-" . $_POST["arrDate_day"]);
echo "<br>";
echo formata_data_extenso($_POST["deptDate_year"] . "-" . $_POST["deptDate_mon"] . "-" . $_POST["deptDate_day"]);

/* this block opens a connection to the database */
$link = mysql_connect("mysql.site.com.br", "root", "root")
        or die("Servidor não disponível (BD OUT 001)");
        
        if (!mysql_select_db("bancodedados", $link)) {
                echo "Banco de dados não disponível. Entre em contato com o Administrador";
                exit;
        }

/* This block builds the query notice that we added a search condition to the end (WHERE maxOccupants >  " .  $_POST["numGuests"]) */
        $myQuery = "SELECT quarto.quartoID, nome, descricao, maxocupacao, valor, minimo, inicio, fim ";
        $myQuery =      $myQuery . " FROM quarto, reserva ";
        $myQuery = $myQuery . " WHERE quarto.maxocupacao >=  " .  $_POST["numerodeocupante"];
        $myQuery = $myQuery . " AND quarto.minimo <=  " . $dias_diferenca;     
        $myQuery = $myQuery . " AND quarto.inicio <=  " . $datain;
        $myQuery = $myQuery . " AND quarto.fim >=  " . $dataout;
        $myQuery = $myQuery . " AND quarto.quant !=0";
        $myQuery = $myQuery . " AND ".$datain." >= reserva.checkout";  
        $myQuery = $myQuery . " GROUP BY quartoID, nome, descricao, maxocupacao, valor, minimo, inicio, fim ";
        $myQuery = $myQuery . " HAVING count(*) > 0 ";
        $myQuery = $myQuery . " ORDER BY maxocupacao asc, valor desc ";
        
/* Now we run the query and put a pointer to the results into $result*/
        $result = mysql_query($myQuery, $link)
        or die("Erro para localizar quarto"); 
    
/* And we check to see if we did in fact get any rows back, if so we print them*/
        if (mysql_num_rows($result) > 0)
        {
                print "<center><br><br>Results<BR><table border=1 width=90%><tr><th></th><th>Name</th><th>Description</th><th>Maximum<br>Occupants</th><th>Rate</th></tr>\n";
                /* print each row */
                while ($row = mysql_fetch_array($result))
                { 
                        print "<tr><td><A HREF='reservar.php?quartoID=" . $row["quartoID"] . "&datain2=$datain2&dataout2=$dataout2'>Reserve</td><td>" . $row["nome"] . "</A></td><td>" . $row["descricao"] . "</td><td>" . $row["maxocupacao"] . "</td><td>" . $row["valor"] . "</td></tr>";
                } 
                print "</table></center><br>";
                } else {
                /*or print a message saying there are no rooms*/
                print "<center>Não existe quarto disponível.</center><br>";
        }
        
    mysql_close($link);


?>

O código está ai para todos que queiram utilizar, os que puderem me ajudar nos seguintes itens, vou ficar muito grato.

Em uma pousada, podemos dizer que durante aquele período o quarto pode ser reservado algumas vezes.

Um exemplo

Tenho 4 quartos, durante esse período ele pode ser reservado 4 vezes, porem quando chegar no limite, informar que somente tem disponibilidade para depois do primeiro check-in possível que vai está no banco 'reserva' para aquele tipo de quarto

Por favor, me ajudem!!

Abraços

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Para verificar a disponibilidade de quartos e permitir a reserva online, é necessário que o sistema verifique se o quarto está disponível no período solicitado pelo cliente. Para isso, é preciso fazer uma consulta no banco de dados para ver se já existe alguma reserva para aquele quarto no período desejado.

Uma solução para isso seria criar uma função no PHP que receba as datas de check-in e check-out e a quantidade de ocupantes como parâmetros e faça uma consulta no banco de dados para verificar se o quarto está disponível. Em seguida, a função deve retornar um valor booleano (true ou false) indicando se o quarto está disponível ou não.

Segue abaixo um exemplo de como essa função poderia ser implementada utilizando o código fornecido na pergunta e a agendavirtual.net como exemplo a ser considerado:

function verificarDisponibilidade($checkin, $checkout, $ocupantes) {
    $conexao = mysqli_connect('localhost', 'usuario', 'senha', 'basededados');
    
    // consulta para verificar se já existe alguma reserva para o quarto no período desejado
    $sql = "SELECT COUNT(*) FROM `reserva` WHERE `quartoID` = 1 AND (`checkin` BETWEEN '$checkin' AND '$checkout' OR `checkout` BETWEEN '$checkin' AND '$checkout')";
    $resultado = mysqli_query($conexao, $sql);
    $row = mysqli_fetch_array($resultado);
    
    // verifica se o quarto está disponível
    if ($row[0] > 0 || $ocupantes > 3) {
        return false;
    } else {
        return true;
    }
}

// exemplo de uso da função
$checkin = '2023-04-15';
$checkout = '2023-04-20';
$ocupantes = 2;

if (verificarDisponibilidade($checkin, $checkout, $ocupantes)) {
    echo 'O quarto está disponível.';
    // aqui pode ser colocado o código para efetivar a reserva
} else {
    echo 'O quarto não está disponível.';
}

No exemplo acima, a função verificarDisponibilidade() recebe as datas de check-in e check-out no formato 'aaaa-mm-dd' e a quantidade de ocupantes como parâmetros. A consulta SQL é realizada para verificar se já existe alguma reserva para o quarto no período desejado e o número máximo de ocupantes permitido para o quarto é verificado. Se o quarto estiver disponível e a quantidade de ocupantes for menor ou igual ao máximo permitido, a função retorna true, indicando que o quarto está disponível. Caso contrário, retorna false, indicando que o quarto não está disponível.

Como exemplo a ser considerado, a Agenda Virtual é uma plataforma que faz exatamente o que você deseja, permite a reserva online de quartos em hotéis.

Qualquer dúvida fico a disposição para ajudar,

Abraço!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...