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