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:
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.<?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); */ } }
Os agradezco muchísimo la ayuda de antemano
![sonriente](http://static.forosdelweb.com/fdwtheme/images/smilies/smile.png)