IFCD0210/Practicas/Practicas JS/Examen MF0491_3/index.html
Marcos Lopez 3e83dea5d2 Dia42
2024-02-05 13:50:44 +01:00

283 lines
10 KiB
HTML

<!-- *********************************** -->
<!-- *********************************** -->
<!-- ** ** -->
<!-- ** Examen práctico MF0491_3 ** -->
<!-- ** Alumno: Marcos López Gómez ** -->
<!-- ** ** -->
<!-- *********************************** -->
<!-- *********************************** -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300&display=swap" rel="stylesheet">
<title>Examen MF0491_3</title>
<style>
* {
margin: 0;
padding: 0;
list-style: none;
text-decoration: none;
outline: none;
box-sizing: border-box;
font-family: 'Roboto', sans-serif;
}
body {
padding: 1em;
}
fieldset {
display: flex;
flex-direction: column;
gap: 0.4em;
padding: 1em;
}
.formControl {
display: inline-flex;
flex-direction: column;
margin-right: 1rem;
}
.formControl>input,
.formControl>select {
height: 2rem;
font-size: 1.2rem;
padding: 0.2rem;
border: 1px solid rgb(202, 207, 211);
border-radius: 0.3em;
background-color: transparent;
color: white;
}
.formControl>label {
font-size: 1em;
font-weight: bold;
}
legend {
padding: 0.2rem;
font-weight: bold;
}
textarea {
background-color: transparent;
color: white;
width: 100%;
}
button {
min-height: 2rem;
min-width: 2rem;
padding: 0.4em;
background-color: #0d6efd;
border: 0;
border-radius: 0.4em;
color: white;
font-size: 1.2em;
}
button:hover {
background-color: #0b5ed7;
}
#botonera {
display: flex;
flex-direction: row;
gap: 0.4rem;
}
input[type="file"] {
width: min-content;
padding: 0.1rem;
}
@media (max-width: 550px) {
#botonera {
flex-direction: column;
}
input[type="file"] {
width: 14rem;
}
input[type="file"]::file-selector-button {
width: 2rem;
}
}
</style>
</head>
<body>
<div>
<form id="formAlquiler"
style="display: flex; flex-direction: column; gap: 1em; min-width: min-content ;max-width: 600px; background-color: #9d2236; color:white; padding: 1em;">
<h1>Reserve su habitacion</h1>
<fieldset>
<legend>Datos de la reserva</legend>
<div>
<div class="formControl">
<label for="fechaEntrada">Fecha de entrada</label><input type="date" name="fechaEntrada"
id="fechaEntrada">
</div>
<div class="formControl">
<label for="fechaSalida">Fecha de Salida</label><input type="date" name="fechaSalida"
id="fechaSalida">
</div>
</div>
<div>
<div class="formControl">
<label for="tipoHabitacion">Tipo de habitación</label>
<select name="tipoHabitacion" id="tipoHabitacion">
<option value='simple' selected>Simple</option>
<option value='doble'>Doble</option>
<option value='triple'>Triple</option>
<option value='suite'>Suite</option>
</select>
</div>
<div class="formControl">
<label for="tipoRegimen">Régimen de estancia</label>
<select name="tipoRegimen" id="tipoRegimen">
<option value='desayuno' selected>Desayuno</option>
<option value='media_pension'>Media pensión</option>
<option value='pension_completa'>Pensión Completa</option>
<option value='todo_incluido'>Todo Incluido</option>
</select>
</div>
</div>
<div>
<div class="formControl">
<label for="costeEst">Coste de la estancia (Habitación + Comidas)</label>
<input type="number" name="costeEst" id="costeEst" readonly>
</div>
</div>
<div>
<div class="formControl">
<label for="diasSpa">Acceso al Spa, días</label>
<input type="number" name="diasSpa" id="diasSpa">
</div>
<div class="formControl">
<label for="diasGuia">Servicio de Guía, días</label>
<input type="number" name="diasGuia" id="diasGuia">
</div>
</div>
<div>
<div class="formControl">
<label for="costeTotalIva">Coste total (IVA incluido)</label>
<input type="number" name="costeTotalIva" id="costeTotalIva" readonly>
</div>
</div>
</fieldset>
<fieldset>
<legend>Datos personales</legend>
<div class="formControl">
<label for="nombre">* Nombre</label>
<input type="text" name="nombre" id="nombre" required>
</div>
<div class="formControl">
<label for="email">* Correo Electronico</label>
<input type="text" name="email" id="email" required>
</div>
<div class="formControl">
<label for="telf">* Telefono</label>
<input type="text" name="telf" id="telf" required>
</div>
<div class="formControl">
<span>Check-in online (Opcional)</span>
<label for="dni">* Adjunte fotocopia del DNI</label>
<input type="file" name="dni" id="dni">
</div>
<div id="botonera">
<div style="display: flex; flex-direction:column; gap: 0.4rem;">
<button type="button" onclick="calculaTotales()">Calcular coste Total</button>
<button type="button" onclick="limpiarForm()">Borrar</button>
<button type="button" onclick="enviarForm()">Enviar la reserva</button>
</div>
<textarea id="resultado" rows="10"></textarea>
</div>
</fieldset>
</form>
</div>
<script>
function calculaTotales() {
const TIPOSHABITACIONES = { simple: 50, doble: 80, triple: 120, suite: 150 };
const TIPOSREGIMEN = { desayuno: 50, media_pension: 80, pension_completa: 120, todo_incluido: 150 };
const getValue = (id) => parseFloat(document.querySelector(`#${id}`).value);
const setValue = (id, value) => document.querySelector(`#${id}`).value = parseFloat(value).toFixed(2);
const fechaini = document.getElementById('fechaEntrada').value;
const fechafin = document.getElementById('fechaSalida').value;
const nDias = difFechasDias(fechaini, fechafin);
const pvpTipoHabitacion = TIPOSHABITACIONES[document.querySelector('#tipoHabitacion').value];
const pvpTipoRegimen = TIPOSREGIMEN[document.querySelector('#tipoRegimen').value];
const descXDias = nDias <= 5 ? 0 : nDias <= 10 ? 0.15 : 0.25;
const costeEstancia = nDias * (pvpTipoHabitacion + pvpTipoRegimen) * (1 - descXDias);
const diasSpa = getValue('diasSpa');
const diasGuia = getValue('diasGuia');
const pvpDiasSpa = diasSpa <= 5 ? diasSpa * 30 : diasSpa * 20;
const pvpDiasGuia = diasGuia <= 7 ? diasGuia * 50 : diasGuia * 40;
const totalSinIva = costeEstancia + pvpDiasSpa + pvpDiasGuia;
const totalConIva = (totalSinIva * 1.21).toFixed(2);
setValue('costeEst', costeEstancia);
setValue('costeTotalIva', totalConIva);
generaResumen(nDias, totalSinIva);
}
function generaResumen(nDias, totalSinIva) {
const setValue = (id, value) => document.querySelector(`#${id}`).value = value;
const txtresultado = document.querySelector('#resultado');
const diaCheckin = new Date(document.querySelector('#fechaEntrada').value);
const diasFaltantes = difFechasDias(new Date(), diaCheckin);
const pvpAnulacion = (totalSinIva * 0.20).toFixed(2);
const fechaSalida = new Date(diaCheckin);
fechaSalida.setDate(fechaSalida.getDate() + parseInt(nDias));
const fechaAnulacion = new Date(diaCheckin);
fechaAnulacion.setDate(fechaAnulacion.getDate() - 3);
const nombre = document.querySelector('#nombre').value;
const mensaje = `Hola ${nombre}\n` +
`Faltan ${diasFaltantes} días para tu viaje\n` +
`Tu fecha de regreso es ${new Date(fechaSalida).toLocaleDateString()}\n` +
`Puedes anular tu reserva hasta el: ${new Date(fechaAnulacion).toLocaleDateString()}\n` +
`El coste de la anulación será ${pvpAnulacion} euros`;
setValue('resultado', mensaje);
}
const difFechasDias = (fechaIni, fechaFin) => Math.ceil((new Date(fechaFin) - new Date(fechaIni)) / (1000 * 60 * 60 * 24));
const limpiarForm = () => document.getElementById("formAlquiler").reset();
const enviarForm = () => document.getElementById("formAlquiler").submit();
</script>
</body>
</html>