Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Acauã ferreira

e-commerce vendendo itens mesmo com disponibilidade zero

Recommended Posts

Olá,Estou com dificuldade de arrumar um bug de um sistema de reservas online de hotel

O sistema ta a aceitando vender um quarto mesmo quando a disponibilidade(Allotment) está em zero.

Devo adicionar uma linha de codigo para filtrar a disponibilidade caso allotment seja = 0 nas datas pesquisadas.

  • Pra mim esta é a linha que está dando erro:

$sql .= "AND pms_allotment.allotment >= '$rooms' \n";

  • DEVERIA SER ALGO TIPO:

$sql .= "AND pms_allotment.allotment > 0 \n"; Mas mesmo com essa variação falta algo,pq o bug ainda persiste....

-A variável '$rooms' é sempre = 1

<?
$sql = "SELECT * \n";
$sql .= "FROM pms_ratecode_rate, pms_allotment \n";
$sql .= "WHERE pms_ratecode_rate.ratecode_id = '$rs[ratecode_id]' \n";
$sql .= "AND pms_allotment.allotmaster_id = '$allotmaster_id' \n";
$sql .= "AND pms_allotment.roomtype_id = '$rs[roomtype_id]' \n";
$sql .= "AND pms_ratecode_rate.ratedate = pms_allotment.allotdate \n";
$sql .= "AND pms_ratecode_rate.ratedate >= '$checkin' \n";
$sql .= "AND pms_ratecode_rate.ratedate < '$checkout' \n";
$sql .= "AND pms_ratecode_rate.ratedate = pms_allotment.allotdate \n";
$sql .= "AND pms_allotment.allotment >= '$rooms' \n";







$stmt1 = $db->prepare($sql);
$stmt1->execute()or die("<pre>$sql</pre>".print_r($stmt1->errorInfo()));
if($stmt1->rowCount()){
  while($rs1 = $stmt1->fetch(PDO::FETCH_ASSOC)){
		list($rate_yy,$rate_mm,$rate_dd) = explode("-",$rs1[ratedate]);
		$ratestamp = mktime(0,0,0,$rate_mm,$rate_dd,$rate_yy);
		$rate[$rs1[ratedate]] = $rs1; 
  }      
  
  $n = 0;
  $notavai = false;
  while($n < $nights){
    $dailycheck_stamp = date("Y-m-d", mktime(0,0,0,$mm1,$dd1+$n,$yy1));
    if(is_array($rate[$dailycheck_stamp]) == false){
      $notavai = true;
    }
    if(is_array($promo) == false){				
      $ratetotal[$rs[ratecode_id]][] = ($rate[$dailycheck_stamp]["rate_$adults"] + ($rate[$dailycheck_stamp]["rate_child"] * $child)) * $rooms;
    }else{
      $rate_promo = ($ratepromo[$dailycheck_stamp]["rate_$adults"] + ($ratepromo[$dailycheck_stamp]["rate_child"] * $child)) * $rooms;
      $rate_cross[$rs[ratecode_id]][] = ($cross_rate[$dailycheck_stamp]["rate_$adults"] + ($cross_rate[$dailycheck_stamp]["rate_child"] * $child)) * $rooms;
      
      $ratetotal[$rs[ratecode_id]][] = $rate_promo;
      $ratetotal_cross[$rs[ratecode_id]][] = $rate_promo;
    }		
    $n++;
  }
  
  if($property[taxtype] == "inclusive"){
    $tax = 0;
    $total = array_sum($ratetotal[$rs[ratecode_id]]);
    $total_notax = $total;
  }else{
    $total_notax = array_sum($ratetotal[$rs[ratecode_id]]);
    $tax = $total_notax * ($property[taxamount]/100);	
    $total = $total_notax + $tax;
  }
  
  $sql = "INSERT INTO pms_rateavai \n";
  $sql .= "SET \n";
  $sql .= "agent_id = '$agent_id', \n";
  $sql .= "session_id = '$session_id', \n";
  $sql .= "property_id = '$property[property_id]', \n";
  $sql .= "ratemaster_id = '$ratemaster_id', \n";
  $sql .= "allotmaster_id = '$allotmaster_id', \n";
  $sql .= "ratecode_id = '$rs[ratecode_id]', \n";
  $sql .= "roomtype_id = '$rs[roomtype_id]', \n";
  $sql .= "checkin = '$checkin', \n";
  $sql .= "checkout = '$checkout', \n";
  $sql .= "nights = '$nights', \n";
  $sql .= "rooms = '$rooms', \n";
  $sql .= "adults = '$adults', \n";
  $sql .= "child = '$child', \n";
  $sql .= "inclusion = '$rs[ratecode_inclusion]', \n";
  $sql .= "policy_id = '$rs[policy_id]', \n";
  $sql .= "taxtype = '$property[taxtype]', \n";
  $sql .= "tax = '$tax', \n";
	$sql .= "room_total = '$total_notax', \n";
  $sql .= "total_notax = '$total_notax', \n";
  $sql .= "total = '$total', \n";
  $sql .= "currency = '$rs[ratecode_currency]' \n";
  $stmtInsert = $db->prepare($sql);
  $stmtInsert->execute()or die("<pre>$sql</pre>".print_r($stmtInsert->errorInfo()));
  $rateavai_id = $db->lastInsertId();
	
  $uri = "?action=bookingcart&rateavai_id=".($rateavai_id);
  $ratecode_total_summary = array_sum($ratetotal[$rs[ratecode_id]]);
    
  if($notavai == false){								
    $n = 0;
    if($weeks == 1){	
      if($nights == 1){
        include("inc.rateavai.query.night.php");
      }else{			
        include("inc.rateavai.query.nights.php");				
      }
    }else{
      include("inc.rateavai.query.weeks.php");
    }	
    $available = true;
    $ratecode_id_count[] = $rs[ratecode_i];

    $roomtype_name = json_decode($rs[roomtype_name],true);
    $data_rate_filter[] = crc($ratecode_total_summary,$rs[ratecode_currency],$currency);
    if($data_roomtype_name_filter[$rs[roomtype_id]] == false){
      if($roomtype_name[$locale] == false){
        $roomtype_name[$locale] = $roomtype_name[en_US];
      }
      $data_roomtype_name_filter[$rs[roomtype_id]] = $roomtype_name[$locale];
    }
    unset($stamp_checkpromo_start);
    unset($stamp_checkpromo_end);
    unset($cross_rate);
    unset($rate_cross);
    unset($promo);	
    unset($ratepromo);
    unset($ratetotal_cross);
    unset($rate);
  }
}
?> 

Fotos do banco de dados onde o allotment disponibilidade está sendo devidamente salvo pelo back end.

Allotment.jpg

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A única possibilidade que eu vejo para o > 0 não funcionar é o campo não ser int, se ele for varchar ou algo do tipo, ai a comparação vai ser prejudicada mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi,

 

Mesmo com allotment > 0 você ainda recebe 0 nos resultados? Tem algo que não está no código que você postou?

Exato, mesmo com o allotment >0 recebo resultados de quartos sem disponibildade para reservar.

creio o codigo está incompleto, deveria ser algo como allotment= allotment-$Rooms , alguma variação do genero

A única possibilidade que eu vejo para o > 0 não funcionar é o campo não ser int, se ele for varchar ou algo do tipo, ai a comparação vai ser prejudicada mesmo.

Fiquei em duvida Eserra:

Agora o codigo ta errado,mas se ele for varchar ou algo do tipo vai ficar pior ainda?

 

 

Poderia me dar um exemplo deste código em um campo int?

 

Obrigado

è somente nesta ultima linha do código que precisa de alguma alteração

<?
$sql = "SELECT * \n";
$sql .= "FROM pms_ratecode_rate, pms_allotment \n";
$sql .= "WHERE pms_ratecode_rate.ratecode_id = '$rs[ratecode_id]' \n";
$sql .= "AND pms_allotment.allotmaster_id = '$allotmaster_id' \n";
$sql .= "AND pms_allotment.roomtype_id = '$rs[roomtype_id]' \n";
$sql .= "AND pms_ratecode_rate.ratedate = pms_allotment.allotdate \n";
$sql .= "AND pms_ratecode_rate.ratedate >= '$checkin' \n";
$sql .= "AND pms_ratecode_rate.ratedate < '$checkout' \n";
$sql .= "AND pms_ratecode_rate.ratedate = pms_allotment.allotdate \n";
$sql .= "AND pms_allotment.allotment >= '$rooms' \n";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode forçar o tipo na query:

http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

 

Contudo isto por via de regra é uma péssima ideia, já que basicamente você está implementando uma gambiarra para corrigir um erro na modelagem do BD. Observe que determinar os tipos correto de coluna é essencial em um projeto, exatamente para evitar dissabores no futuro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode forçar o tipo na query:

http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

 

Contudo isto por via de regra é uma péssima ideia, já que basicamente você está implementando uma gambiarra para corrigir um erro na modelagem do BD. Observe que determinar os tipos correto de coluna é essencial em um projeto, exatamente para evitar dissabores no futuro.

O banco de dados está bem modelado,o que faltou é linha de código eficiente para controlar a disponibilidade,quando solicitado no site...

Achei muito complexo de analisar seu link enviado... : /

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como a questão aqui diz respeito à query e/ou modelagem, movendo para MySQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, me deu sono esse códgo!

Cara, sempre vai ser 1, você está colocando >= 0;

Usa um num_rows, faz um "ifizinho!

if ($num_rows == 0)

não reserva!

}

else {
reserva

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tentou rodar a query diretamente no banco de dados/phpmyadmin? É impossível a condição > 0 não se satisfazer, sendo que não existe nenhuma clausula lógica OR.

 

Imprima o SQL gerado, cole no banco dados, veja os resultados e modifique a query até conseguir o resultado desejado.

 

Nos envie a query já formatada, e não a que é dinamicamente criada que poderemos auxiliar melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Olá,após os t estes que voces sugeriram cheguei a conclusão que o >0 realmente funciona.
Mas preciso linkar o ALLOTMENT ao ROOMTYPE_ID (tipo de quarto), pq quando quero selecionar o Quarto X,e ele nao tem disponibilidade em alugm dia da minha estadia,o sistema 'ROUBA' o Allotment do quarto Y (se disponivel) pra poder vender o quarto X.
*Em outras palavras
-Atualmente o sistema está dizendo assim: ver se tem disponibilidade do dia 1 ao 8 de janeiro,não importa em qual quarto,se tiver disponibilidade em quartos diferentes,juntar as tarifas e vender todos os quartos como se fosse um quarto só.
Esse código abaixo funcionou bem,mas funciona em 1 quarto só,
$sql .= "AND pms_allotment.allotment  > 0   AND   (pms_allotment.roomtype_id =1)  \n";

se o sistema aceitasse eu adicionar algo tipo ... room_type id = 1 ''to'' 10 funcionaria perfeito

Já tentei ...room_type id BETWEEN 1 AND 10....
também sem sucesso.

 

Se eu uso:

.allotment > 0 AND (pms_allotment.roomtype_id =1) \n";
o quarto id 1 funcinona perfeitamente e outros quartos somem do resultado

Se eu uso :

.allotment > 0 AND (pms_allotment.roomtype_id =3) \n";

o quarto id 3 funciona perfeitamente e outros quartos somem do resultado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o nome da tabela relacionada? rommtypes?

 

Se sim você pode fazer a verificação com uma subquery:

 

 

WHERE rommtype_id IN (SELECT id FROM rommtypes WHERE $query)

 

Assim você pode buscar dinamicamente baseado em 'query', que não sei qual vai ser pro seu caso sem ver as tabelas.

 

Mas se precisa so checar se é de 1 a 10:

 

allotment > 0 AND allotment <= 10;

 

Between deveria ter funcionado... estranho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.