Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Organizar Precios y Temporadas

Estas en el tema de Organizar Precios y Temporadas en el foro de PHP en Foros del Web. Ahora solo me queda alimentar dinámicamente esto: Código PHP: $temporadaBaja  = array(      array( '13/01' ,  '10/03' ),      array( '07/04' ,  '14/06' ),      array( '01/09' ,  '26/11' ...

  #31 (permalink)  
Antiguo 17/01/2016, 07:17
Avatar de manyblue  
Fecha de Ingreso: marzo-2008
Mensajes: 329
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Organizar Precios y Temporadas

Ahora solo me queda alimentar dinámicamente esto:
Código PHP:
$temporadaBaja = array( 
    array(
'13/01''10/03'), 
    array(
'07/04''14/06'), 
    array(
'01/09''26/11')); 
 
$temporadaMedia = array( 
    array(
'11/03''26/03'), 
    array(
'15/06''31/07'), 
    array(
'27/11''14/12')); 
 
$temporadaAlta = array( 
    array(
'27/03''06/04'), 
    array(
'01/08''31/08'), 
    array(
'01/08''31/08')); 
 
$especial = array( 
    array(
'01/01''12/01')); 
Para lo cual crearé otra tabla tbl_Temporadas_hotel
Código PHP:
CREATE TABLE IF NOT EXISTS `tbl_temporadas_hotel` (
  `
idTemporada_Hotelint(11NOT NULL AUTO_INCREMENT,
  `
refHotelint(11) DEFAULT NULL,
  `
intNombreTemporadaHotelvarchar(150) DEFAULT NULL,
  `
intDiaDesdeint(2) DEFAULT NULL,
  `
intMesDesdeint(2) DEFAULT NULL,
  `
intDiaHastaint(2) DEFAULT NULL,
  `
intMesHastaint(2) DEFAULT NULL,
  
PRIMARY KEY (`idTemporada_Hotel`)
ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 
Cuando lo acabe dejaré todo el codigo por aquí pues no me gusta dejar los post a medias.
Un saludo: Manyblue
  #32 (permalink)  
Antiguo 17/01/2016, 12:33
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 3 años, 11 meses
Puntos: 14
Respuesta: Organizar Precios y Temporadas

:) Ya lo se que los datos son dinámicos. Yo solo te doy un ejemplo, lo pruebas cambiando las fechas a mano o cambiando estos datos usando un formulario. Si te escribo el código y solo lo copias sin mas no hacemos nada. La idea del foro creo que es mas bien enseñar como hacerlo, dar pistas para que cada uno piense en la solución y el porque funciona o no funciona.

"Dale a un hombre un pescado y comerá un día, enséñale a pescar y comerá toda la vida".

NOTA*** ten cuidado con el orden de los bucles. Si hay "conflictos" entre temporadas / precios debes decidir cual tiene prioridad.
Ejemplo: si tienes temporada baja del 01/01 al 10/01 y temporada alta del 08/01 al 20/01 el bucle en cuanto encuentra el primero es el que usa. No se si me explico...
Como has visto en mi ejemplo (primero del hilo), el primer bucle es sobre precio especial, si el precio especial tiene la misma fecha que la temporada alta, lo que te va a sumar es el precio especial no la temporada alta. Esto lo tienes que tener en cuenta también a la hora de guardar tus temporadas en la base de datos.

Un saludo,
  #33 (permalink)  
Antiguo 18/01/2016, 02:27
Avatar de manyblue  
Fecha de Ingreso: marzo-2008
Mensajes: 329
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Organizar Precios y Temporadas

x_atrix
Muchísimas gracias. Joder pues mira que si que me has hecho currar jajajajaja, pero lo comprendo, es la única manera de que aprenda, por eso llevo en este foro desde hace tiempo.
Cogí lo del bucle. pero no habrá problema por que el precio especial lo sacaré del bucle, lo pongo en la tabla de habitaciones y hago un if de que si existe lo coja y descartes las demas temporadas, no se si me explico.
Mi hermano, como te dije al principio, muchísimas gracias por tus molestias, sin tu ayuda no lo hubiera conseguido pues no controlo las clases de php, estoy comenzando.
Bueno solo queda pendiente de poner aquí el final de este post que lo haré cuando acabe.
Un saludo: manyblue

PD: Solo una cosita más, como hago esto, así:
Código PHP:
<?php 
$DiaDesde 
$row_ConsultaTemporadasHotel['strDiaDesde'];
$MesDesde $row_ConsultaTemporadasHotel['strMesDesde'];
$DiaHasta $row_ConsultaTemporadasHotel['strDiaHasta'];
$MesHasta $row_ConsultaTemporadasHotel['strMesHasta'];

if(
$row_ConsultaTemporadasHotel['strNombreTemporadaHotel'] == "Baja"){
  do {
    
$temporadaBaja = array(
    array(
"$DiaDesde/$MesDesde""$DiaHasta/$MesHasta"),);
  
  } while (
$row_ConsultaTemporadasHotel mysql_fetch_assoc($ConsultaTemporadasHotel));  
}
if(
$row_ConsultaTemporadasHotel['strNombreTemporadaHotel'] == "Media"){
  do {
    
$temporadaMedia = array(
    array(
"$DiaDesde/$MesDesde""$DiaHasta/$MesHasta"),);
  
  } while (
$row_ConsultaTemporadasHotel mysql_fetch_assoc($ConsultaTemporadasHotel));  
}
if(
$row_ConsultaTemporadasHotel['strNombreTemporadaHotel'] == "Alta"){
  do {
    
$temporadaAlta = array(
    array(
"$DiaDesde/$MesDesde""$DiaHasta/$MesHasta"),);
  
  } while (
$row_ConsultaTemporadasHotel mysql_fetch_assoc($ConsultaTemporadasHotel));  
}
if(
$row_ConsultaTemporadasHotel['strNombreTemporadaHotel'] == "Especial"){
  do {
    
$temporadaEspecial = array(
    array(
"$DiaDesde/$MesDesde""$DiaHasta/$MesHasta"),);
  
  } while (
$row_ConsultaTemporadasHotel mysql_fetch_assoc($ConsultaTemporadasHotel));  
}
?>

Última edición por manyblue; 18/01/2016 a las 02:50
  #34 (permalink)  
Antiguo 18/01/2016, 07:49
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 3 años, 11 meses
Puntos: 14
Respuesta: Organizar Precios y Temporadas

Esto seria puro SQL. Aprovecha lo que te ofrece MySQL.
Tienes las siguientes funciones:
Código MySQL:
Ver original
  1. CONCAT_WS(separador, columnaUno, columnaDos...)
Y
Código MySQL:
Ver original
  1. LPAD(columna, tamano, caracteres)

La primera función te concatena varios datos usando el separador, la segunda te sirve para añadir ceros delante de los números si solo tiene uno. Con la siguiente consulta te deberia devolver ya los rangos formateados para usarlo sin tener que tratarlo en PHP.
Código MySQL:
Ver original
  1. SELECT CONCAT_WS('/', LPAD(`intDiaDesde`, 2, '0'), LPAD(`intMesDesde`, 2, '0')) AS desde, CONCAT_WS('/', LPAD(`intDiaHasta`, 2, '0'), LPAD(`intMesHasta`, 2, '0')) AS hasta, intNombreTemporadaHotel FROM tbl_temporadas_hotel;
Te devuelve algo así:
Código:
+-------+-------+-------------------------+
| desde | hasta | intNombreTemporadaHotel |
+-------+-------+-------------------------+
| 01/01 | 03/02 | baja                    |
| 04/02 | 05/03 | baja                    |
+-------+-------+-------------------------+
  #35 (permalink)  
Antiguo 19/01/2016, 02:47
Avatar de manyblue  
Fecha de Ingreso: marzo-2008
Mensajes: 329
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Organizar Precios y Temporadas

La verdad es que si no fuera por la gente de este foro ..., date cuenta de una cosa, no soy informático ni programador profesional, soy un capitan de la marina mercante española de 54 años aficionado a la programación.
Muchísimas gracias x_atrix, lo miro y aplico.
Un fuerte abrazo desde las Islas Canarias
  #36 (permalink)  
Antiguo 26/01/2016, 05:17
Avatar de manyblue  
Fecha de Ingreso: marzo-2008
Mensajes: 329
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Organizar Precios y Temporadas

x_atrix MUCHÍSIMAS GRACIAS.
Joder me ha costado pero ya está, creo.
El código quedaría así:
Código PHP:
  <?php
      
      $desde 
date('d/m'strtotime($_GET['FDesde']));
      
$hasta date('d/m'strtotime($_GET['FHasta']));

      
      class 
Temporadas {
       
          protected 
$temporadas = array(); 
      
       
          protected 
$acumulador 0.0;
       
          public function 
__construct($baja$media$alta$especial) {
              
$this->temporadas['baja']      = $baja;
              
$this->temporadas['media']     = $media;
              
$this->temporadas['alta']      = $alta;
              
$this->temporadas['especial']  = $especial;
          }
       
          protected function 
esTemporada($temporada$dia) {
              foreach(
$this->temporadas[$temporada] as $rango) {
                  
$desde $this->getTime($rango[0]);
                  
$hasta $this->getTime($rango[1]);
       
                  if (
$dia >= $desde && $dia <= $hasta) {
                      return 
true;
                  }
              }
       
              return 
false;
          }
       
          public function 
esTemporadaBaja($dia) {
              return 
$this->esTemporada('baja'$dia);
          }
       
          public function 
esTemporadaMedia($dia) {
              return 
$this->esTemporada('media'$dia);
          }
       
          public function 
esTemporadaAlta($dia) {
              return 
$this->esTemporada('alta'$dia);
          }
       
          public function 
esEspecial($dia) {
              return 
$this->esTemporada('especial'$dia);
          }
       
          public function 
acumular($precio) {
              
$this->acumulador += floatval($precio);
          }
       
          public function 
precioTotal() {
              return 
$this->acumulador;
          }
       
          public function 
getTime($dia) {
              
// Cambia el orden para strtotime, es mm/dd/yyyy
      
              
list($dia$mes) = explode('/'$dia);
              return 
strtotime($mes '/' $dia '/' date('Y'));
          }
      }
      
    
     
///////////////////////////////
        //CARGAR TEMPORADA BAJA
        
mysql_select_db($database_Conexion_db_WebReservas$Conexion_db_WebReservas);
        
$query_ConsultaTB sprintf("SELECT * FROM tbl_temporadas_hotel WHERE tbl_temporadas_hotel.refHotel = %s AND      strNombreTemporadaHotel='Baja'"GetSQLValueString($varHotelTemporada_ConsultaTemporadasHotel"int"));
        
$ConsultaTB mysql_query($query_ConsultaTB$Conexion_db_WebReservas) or die(mysql_error());
        
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB);
        
$totalRows_ConsultaTB mysql_num_rows($ConsultaTB);
        
$temporadaBaja=array();        
         do {                           
           
$t1=str_pad($row_ConsultaTB["strDiaDesde"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesDesde"], 2'0'STR_PAD_LEFT);
           
$t2=str_pad($row_ConsultaTB["strDiaHasta"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesHasta"], 2'0'STR_PAD_LEFT);
           
$vector=array($t1$t2);
           
array_push($temporadaBaja$vector);
         } while (
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB)); 
         
//print_r($temporadaBaja);
         //CARGAR TEMPORADA ALTA
        
mysql_select_db($database_Conexion_db_WebReservas$Conexion_db_WebReservas);
        
$query_ConsultaTB sprintf("SELECT * FROM tbl_temporadas_hotel WHERE tbl_temporadas_hotel.refHotel = %s AND      strNombreTemporadaHotel='Media'"GetSQLValueString($varHotelTemporada_ConsultaTemporadasHotel"int"));
        
$ConsultaTB mysql_query($query_ConsultaTB$Conexion_db_WebReservas) or die(mysql_error());
        
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB);
        
$totalRows_ConsultaTB mysql_num_rows($ConsultaTB);
        
$temporadaMedia=array();        
         do {                           
           
$t1=str_pad($row_ConsultaTB["strDiaDesde"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesDesde"], 2'0'STR_PAD_LEFT);
           
$t2=str_pad($row_ConsultaTB["strDiaHasta"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesHasta"], 2'0'STR_PAD_LEFT);
           
$vector=array($t1$t2);
           
array_push($temporadaMedia$vector);
         } while (
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB));  
         
//print_r($temporadaMedia);
         //CARGAR TEMPORADA MEDIA
        
mysql_select_db($database_Conexion_db_WebReservas$Conexion_db_WebReservas);
        
$query_ConsultaTB sprintf("SELECT * FROM tbl_temporadas_hotel WHERE tbl_temporadas_hotel.refHotel = %s AND      strNombreTemporadaHotel='Alta'"GetSQLValueString($varHotelTemporada_ConsultaTemporadasHotel"int"));
        
$ConsultaTB mysql_query($query_ConsultaTB$Conexion_db_WebReservas) or die(mysql_error());
        
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB);
        
$totalRows_ConsultaTB mysql_num_rows($ConsultaTB);
        
$temporadaAlta=array();        
         do {                           
           
$t1=str_pad($row_ConsultaTB["strDiaDesde"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesDesde"], 2'0'STR_PAD_LEFT);
           
$t2=str_pad($row_ConsultaTB["strDiaHasta"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesHasta"], 2'0'STR_PAD_LEFT);
           
$vector=array($t1$t2);
           
array_push($temporadaAlta$vector);
         } while (
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB)); 
         
        
//CARGAR TEMPORADA ESPECIAL
        
mysql_select_db($database_Conexion_db_WebReservas$Conexion_db_WebReservas);
        
$query_ConsultaTB sprintf("SELECT * FROM tbl_temporadas_hotel WHERE tbl_temporadas_hotel.refHotel = %s AND      strNombreTemporadaHotel='Especial'"GetSQLValueString($varHotelTemporada_ConsultaTemporadasHotel"int"));
        
$ConsultaTB mysql_query($query_ConsultaTB$Conexion_db_WebReservas) or die(mysql_error());
        
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB);
        
$totalRows_ConsultaTB mysql_num_rows($ConsultaTB);
        
$especial=array();        
         do {                           
            
$t1=str_pad($row_ConsultaTB["strDiaDesde"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesDesde"], 2'0'STR_PAD_LEFT);
           
$t2=str_pad($row_ConsultaTB["strDiaHasta"], 2'0'STR_PAD_LEFT)."/".str_pad($row_ConsultaTB["strMesHasta"], 2'0'STR_PAD_LEFT);
           
$vector=array($t1$t2);
           
array_push($especial$vector);
         } while (
$row_ConsultaTB mysql_fetch_assoc($ConsultaTB)); 
          
   
      
// Precios por temporada
      
      
$precioBaja     number_format($row_ConsultaHabitaciones['intPrecio_Baja'], 2) . ' €';
      
$precioMedia    number_format($row_ConsultaHabitaciones['intPrecio_Media'], 2) . ' €';
      
$precioAlta     number_format($row_ConsultaHabitaciones['intPrecio_Alta'], 2) . ' €';
      
$precioEspecial number_format($row_ConsultaHabitaciones['intPrecio_Especial'], 2) . ' €';
       
      
$helper = new Temporadas($temporadaBaja$temporadaMedia$temporadaAlta$especial);
       
      
// Fechas seleccionadas
      
      
$inicio $helper->getTime($desde);
      
$final  $helper->getTime($hasta);
       
       
      for (
$i $inicio$i $final$i += 60 60 24) {
        
       
          if (
$helper->esEspecial($i)) {
              
// Acumular precio
      
              
$helper->acumular($precioEspecial);
               
"<td>".date('d/m/Y',$i)."</td><td>Precio Especial</td><td>$precioEspecial</td>";
       
          } else if (
$helper->esTemporadaAlta($i)) {
              
// Acumular precio
      
              
$helper->acumular($precioAlta);
               
"<td>".date('d/m/Y',$i)."</td><td>Temporada Alta</td><td>$precioAlta</td>";
       
          } else if (
$helper->esTemporadaMedia($i)) {
              
// Acumular precio
      
              
$helper->acumular($precioMedia);
               
"<td>".date('d/m/Y',$i)."</td><td>Temporada Media</td><td>$precioMedia</td>";
       
          } else if (
$helper->esTemporadaBaja($i)) {
              
// Acumular precio
      
              
$helper->acumular($precioBaja);
               
"<td>".date('d/m/Y',$i)."</td><td>Temporada baja</td><td>$precioBaja</td>";
       
          }
       
          
      }
       
      
$total $helper->precioTotal();
?>
Tema zanjado, muchísimas gracias y un saludo: Manyblue
  #37 (permalink)  
Antiguo 26/01/2016, 05:20
Avatar de manyblue  
Fecha de Ingreso: marzo-2008
Mensajes: 329
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Organizar Precios y Temporadas

Al final me fato esto:
Código PHP:
$total number_format($helper->precioTotal(), 2); 

Etiquetas: organizar, precios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:09.