Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/06/2017, 13:18
alejandromaringomez
 
Fecha de Ingreso: abril-2010
Mensajes: 267
Antigüedad: 14 años
Puntos: 1
Información entre dos fechas

Buenas noches a todos :)

Comento, estoy desarrollando una web, y hay un tema con el que no me aclaro, no consigo lo siguiente: Imaginad que tenemos dos inputs para fechas con el siguiente formato: YYYY-mm-dd

Tengo que aplicar según tres tipos de temporada (baja, media y alta) un suplemento a un precio base, los suplementos son: un suplemento de la temporada, y suplemento según cantidad de días (max 6 días de suplemento), es decir:

Por ejemplo:

- suplemento_temporada_alta + supl_tem_alta_1dia o supl_tem_alta_2dia o supl_tem_alta_3dia o supl_tem_alta_4dia o supl_tem_alta_5dia o supl_tem_alta_6dia

Las temporadas están comprendidas entre las siguientes fechas:

Temporada BAJA: 6 de Enero y 15 de Marzo
Temporada MEDIA: 16 de Marzo y 30 de Junio
Temporada ALTA: 1 de Julio y 31 de Octubre
Temporada BAJA: 1 de Noviembre y 15 de Diciembre
Temporada MEDIA: 16 de Diciembre y 5 de Enero

He estado dándole muchas vueltas y esto es lo mucho que he conseguido:

Código:
<?php

	require 'config.php';
	
	require 'template.php';
	
	if(!empty($_GET['vehicle'])) {
		
		$query = mysqli_query($config['mysqli']['connect'], 'SELECT * FROM `vehicles` WHERE `id` = ' . $_GET['vehicle']);
		
		while($vehicle = mysqli_fetch_array($query)) {
			
			/*
			
				Nota: El formato de fecha de entrada es YYYY-mm-dd
			
			*/
			
			$price = $vehicle['base_price'];
			
			/* Comprueba si la fecha esta entre dos fechas */
			
			function check_in_season($date, $season_start, $season_end) {
				
				return (strtotime($date) >= strtotime($season_start) && strtotime($date) <= strtotime($season_end) ? true : false);
				
			}
			
			/* Devuelve el numero de dias entre dos fechas */
			
			function restar_fechas($start, $end) {
				
				$days = strtotime($start) - strtotime($end);
				
				return abs(intval($days/60/60/24));
				
			}
			
			/* */
			
			function comprobar_temporada($inicio, $fin, $date_entrega, $date_devolucion) {
				
				if(strtotime($date_entrega) >= strtotime($inicio) && strtotime($date_entrega) <= strtotime($fin)) {
				
					return (strtotime($date_devolucion) >= strtotime($inicio) && strtotime($date_devolucion) <= strtotime($fin) ? true : false);
					
				} else {
				
					return false;
				
				}
				
			}
			
			/* Comprueba en que temporada estamos */
			
			function season($date) {
				
				$year = date('Y', strtotime($date));
				
				if(check_in_season($year . '-01-06', $year . '-03-15', $date) || check_in_season($year . '-11-01', $year . '-12-15', $date)) {
					
					return 1;
					
				} else if(check_in_season($year . '-12-16', $year + 1 . '-01-05', $date) || check_in_season($year . '-03-16', $year . '-06-30', $date)) {
					
					return 2;
					
				} else if(check_in_season($year . '-07-01', $year . '-10-31', $date)) {
					
					return 3;
					
				} else {
					return false;
				}
				
			}
			
			/* Sistema de anadir suplementos */
			
			$between_seasons = false;
			
			if(5==3) {
				
				/* Aqui iria lo mismo si estamos en la misma estacion */
				
			} else {
				
				/* En caso de que estemos entre temporadas */
				
				$between_seasons = true;
				
				/* Bucle por cada temporada */
				
				for($i = 1; $i <= 3; $i++) {
					
					/* Bucle para comprobar la temporada para la fecha de ENTREGAR */
					
					if(season($_GET['date_re']) == $i) {
						
						/* Anadimos suplemento generico por temporada */
						
						$season_supplement = ($i == 3 ? 'high_season_supplement' : ($i == 2 ? 'half_season_supplement' : 'low_season_supplement'));
						
						/* hacemos bucle para comprobar los dias y segun el dia anadimos el suplemento especifico */
						
						for($x = 1; $x <= 6; $x++) {
							
							if(restar_fechas($_GET['date_re'], $_GET['date_de']) == $x) {
								
								$season_supplement_days = $season_supplement . '_' . $x . '_days';
								
							}
							
						}
						
						echo 're: ' . $season_supplement . ' + ' . $season_supplement_days;
						
					}
					
					/* Bucle para comprobar la temporada para la fecha de DEVOLVER */
					
					if(season($_GET['date_de']) == $i) {
						
						/* Anadimos suplemento generico por temporada */
						
						$season_supplement = ($i == 3 ? 'high_season_supplement' : ($i == 2 ? 'half_season_supplement' : 'low_season_supplement'));
						
						/* hacemos bucle para comprobar los dias y segun el dia anadimos el suplemento especifico */
						
						for($x = 1; $x <= 6; $x++) {
							
							if(restar_fechas($_GET['date_re'], $_GET['date_de']) == $x) {
								
								$season_supplement_days = $season_supplement . '_' . $x . '_days';
								
							}
							
						}
						
						echo 'de: ' . $season_supplement . ' + ' . $season_supplement_days;
						
					}
					
				}
				
				/* if($suplemento_temporada_fecha_1 <= $suplemento_temporada_fecha_2) {
					
					$price = (($price + $suplemento_temporada_fecha_2) * restar_fechas($_GET['date_re'], $_GET['date_de'])) + $suplementos_temporada_fecha_2;
					
				} else {
					
					$price = (($price + $suplemento_temporada_fecha_1) * restar_fechas($_GET['date_re'], $_GET['date_de'])) + $suplementos_temporada_fecha_1;
					
				} */
			
			}
			
			/* echo round($price, 2); */
		
		}
	
	}
Siento que esté un poco liado todo pero tengo un jaleo enorme, este sistema según he estado dandole vueltas, la idea me serviría si o la fecha de recogida del vehículo y la de devolución se encuentra en el mismo mes o una en este mes y la otra en el siguiente, por lo que si dejase un mes de por medio fallaría. Entiendo que por bucles sacando los meses que hay de por medio y los días de esos meses que se seleccionan podría seguir el código. Pero no lo he conseguido.

Os agradezco muchísimo la ayuda de antemano