Salta el contingut

logo_header_borja

Exercici intermedi: Gestió mínima de Rent-a-Car

Objectius: - Practicar bucles (for, for...of), condicionals (if/else), i switch/case. - Manipular arrays amb operacions comunes (afegir, eliminar, filtrar, ordenar, map, reduce). - Gestionar esdeveniments i actualitzar el DOM dinàmicament. - Utilitzar objectes natius de JavaScript (Date, Math, localStorage). - Definir i utilitzar objectes generats per l'usuari (classes). - Escriure funcions natives i pròpies reutilitzables. - Càlculs senzills relacionats amb dates (nombre de dies) i tarifes.

Descripció general: Crea una aplicació web de tipus "Rent-a-Car (mínim)" que permet gestionar un parc de vehicles i lloguers bàsics. L'aplicació no ha de ser completa, però ha d'incloure les funcionalitats bàsiques per a practicar els conceptes mencionats.

Entregables: 1. Un únic fitxer HTML amb CSS mínim i JavaScript (integrat o extern). 2. Un fitxer de text amb la solució comentada pas a pas (explicacions de les decisions clau).

Requisits funcionals (mínims): 1. Gestió del parc de vehicles: - Formulari per afegir un vehicle: marca/model, matrícula, tipus (cotxe, furgoneta, etc.), tarifa diària, estat inicial (available / maintenance). - Afegir el vehicle a un array en memòria i mostrar-lo al DOM en forma de llista o taula. - Permetre eliminar un vehicle (només si no està llogat). 2. Gestió de lloguers: - Formulari per crear un lloguer: seleccionar vehicle disponible, nom client, data d'inici, data de finalització. - Calcular la durada en dies i el preu total (dies * tarifa diària). - Marcar el vehicle com a "rented" mentre dura el lloguer. - Permetre tancar/retornar un lloguer (marcar vehicle com a available) i registrar la data de retorn. 3. Filtrat i ordenació: - Filtrar vehicles per estat (Tots / Available / Rented / Maintenance). - Ordenar per tarifa diària (asc/desc) o per marca/model. 4. Estadístiques: - Total de vehicles. - Vehicles disponibles. - Vehicles llogats. - Ingressos totals calculats a partir dels lloguers tancats (usar reduce). 5. Persistència: - Desa els vehicles i lloguers a localStorage perquè la informació persisteixi entre recarregades. 6. Estructura i bones pràctiques: - Utilitza classes (p. ex. Vehicle i RentalManager o FleetManager) per encapsular la lògica. - Usa addEventListener per gestionar esdeveniments. - Utilitza mètodes d'array (map, filter, reduce, sort, forEach) en punts clau. - Inclou un switch/case com a part d'una funció que executi accions segons una opció (p. ex. handleAction(action, payload)). 7. Validacions: - El formulari de vehicle ha de requerir marca/model, matrícula i tarifa positiva. - El formulari de lloguer ha de verificar que la data final és posterior a la data d'inici i que el vehicle està disponible. 8. Dades d'exemple: - Carrega automàticament 3 vehicles de mostra a l'inicialització per facilitar les proves.

Casos de prova suggerits: - Afegir un vehicle amb dades correctes i comprovar que apareix a la llista. - Crear un lloguer amb un vehicle disponible i comprovar que el vehicle canvia d'estat a "rented". - Intentar crear un lloguer amb dates incorrectes i comprovar validació. - Retornar un vehicle i comprovar que l'estat torna a "available" i que s'actualitzen ingressos (si es tanca el lloguer). - Filtrar la llista per estat i comprovar resultats. - Ordenar la llista per tarifa ascendent/descendent. - Recarregar la pàgina i comprovar que les dades persisteixen.

Pistes i consells: - Genera ids únics amb Date.now() + Math.random(). - Emmagatzema dates en format ISO (YYYY-MM-DD) per facilitar comparacions i ordenacions. - Per calcular dies entre dues dates utilitza la diferència en mil·lisegons i divideix per (1000 * 60 * 60 * 24) i aplica Math.ceil o Math.floor segons la definició que provis (normalment inclusive => +1 si cal). - Mantingues l'estat UI (filtres i ordre) en variables i re-renderitza la vista quan canviïn. - Mantingues la lògica de dades separada del DOM: FleetManager s'encarrega de la lògica, la interfície només mostra i captura esdeveniments. - Evita usar innerHTML amb dades no escapades; prefereix createElement i textContent per seguretat.