Este repositorio fue generado utilizando la semilla Biblioteca Typescript. Recomendamos leer su README para conocer un poco más sobre las tecnologías elegidas y los requisitos para poder utilizarlo.
El enunciado tiene mucha información, van a necesitar leerlo varias veces. La sugerencia es que lo lean entero una vez (para tener una idea general) y luego vuelvan a consultarlo las veces que hagan falta.
Concentrensé en los requerimientos y, excepto que se traben mucho, respeten el orden sugerido. No es necesario que hagan TDD, pero sí sería interesante que vayan creando las distintas clases y métodos a medida que resuelven cada requerimiento y no antes.
En otras palabras: trabajen completando cada requerimiento antes de pasar al siguiente, con los tests que aseguran que funciona incluidos. Si al avanzar en los requerimientos les parece necesario refactorizar, adelante, van a tener los tests que garantizan que no rompieron nada. 😏
Se pide desarrollar el modelo para un sistema de manejo de venta de pasajes de distintas empresas aéreas. Cada empresa tiene varios aviones, de cada avión se conoce la cantidad máxima de asientos que puede llevar y su peso.
De cada vuelo que una empresa saca a la venta, se establece:
- su fecha,
- el avión que se va a usar,
- el origen,
- el destino,
- y un precio que se define como precio estándar para el vuelo.
El sistema permite comprar un pasaje para un determinado vuelo. Cuando eso sucede, se emite un pasaje en el que registra la fecha de venta, el DNI del pasajero o pasajera y el importe que la persona abonó por él. Los pasajes no llevan número de asiento.
Las empresas manejan tres tipos de vuelo, y cada tipo determina cómo se organizan los asientos de un avión. Cada vuelo se crea con su tipo, y no es posible modificarlo después. El tipo define tres cosas:
- la cantidad de asientos disponibles, que pueden usarse para pasajeros,
- la cantidad de asientos ocupados, que ya están reservados para algún pasajero,
- el peso de la carga, que servirá para calcular el peso de un vuelo.
Independientemente del tipo de vuelo, la cantidad de asientos libres se calcula como: cantidad de asientos disponibles - cantidad de asientos ocupados. Como veremos más adelante, esta cuenta puede llegar a dar como resultado un número negativo.
- Asientos disponibles: todos los asientos del avión están disponibles para llevar pasajeros,
- Asientos ocupados: son los de los pasajes vendidos para el vuelo,
- Peso de la carga: la cantidad de pasajeros multiplicada por el peso del equipaje que permite llevar la empresa a cada pasajero (esto se configura para cada empresa).
- Asientos disponibles: tiene 10 asientos disponibles para pasajeros, el resto del avión se utiliza para transportar vacunas,
- Asientos ocupados: son los de los pasajes vendidos para el vuelo,
- Peso de la carga: el peso de la carga (que se configura para cada vuelo) más 700 kg de equipamiento de seguridad.
Es un vuelo que se hace para algún evento especial.
- Asientos disponibles: es la
cantidad máxima de asientos del avión - 25, porque se ocupa una parte del avión para armar una pequeña barra que sirve tragos durante el vuelo (¡qué nivel!), - Asientos ocupados: En el momento en que se organiza, ya tiene asignada una cantidad de pasajeros VIP cuyos datos no conocemos, pero sí sabemos cuántos son. Los asientos ocupados son los de estos pasajeros VIP más los de los pasajes que se vendan,
- Peso de la carga: 5000 kg (fijo, no cambia).
Para cada vuelo, la empresa también establece una política de precio para ofrecer cada asiento. Se deben considerar estas tres variantes:
- 💰 Estricta: todos los asientos se venden al precio estándar.
- 📨 Venta anticipada: si el vuelo tiene menos de 40 pasajes vendidos, 30% del precio estándar. Si el vuelo tiene entre 40 y 79 pasajes vendidos, 60% del precio estándar. Caso contrario, corresponde el precio estándar completo.
- 📣 Remate: si el vuelo tiene más de 30 asientos libres entonces corresponde el 25% del precio estándar, si no el 50%.
Observar que el precio depende de la cantidad de asientos vendidos en el vuelo. 😉
Importante: la empresa puede decidir cambiar de política de precio para un vuelo existente, de acuerdo a cómo venga la venta. Tener en cuenta que estas tres variantes se eligieron para un primer prototipo, la idea es implementar más a futuro.
La empresa decide si se puede vender o no pasajes sobre un vuelo, de acuerdo a uno de estos criterios:
- 🛡️ Segura: se pueden vender pasajes sobre los vuelos que tengan, al menos, 3 asientos libres.
- 🤑 Laxa fija: se permite vender en cada vuelo hasta 10 pasajes más de los asientos disponibles.
- 💯 Laxa porcentual: se permite vender en cada vuelo hasta un 10% más de los asientos disponibles.
- 😷 Pandemia: no se puede vender ningún pasaje.
Este criterio es general para la empresa: el que la empresa elija, aplica para todos los vuelos. Si la empresa cambia de criterio, la nueva política rige para todos los vuelos, actuales y futuros.
Por último, tenemos a la IATA (Asociación Internacional de Transporte Aéreo), que es una organización que regula la actividad aérea definiendo estándares y realizando estadísticas sobre todos los vuelos que hay en el mundo.
En este sistema, nos interesa que todos los vuelos que se crean queden registrados en la IATA, para posteriormente poder realizar estadísticas con ellos. Además, la IATA fija un valor para el peso estándar de un pasajero, que se utiliza para calcular el peso máximo de un vuelo.
- Conocer la cantidad de asientos libres de un vuelo.
- Saber si se pueden vender pasajes para un vuelo o no, de acuerdo al criterio que en el momento tenga la empresa.
- Saber el precio de venta de pasaje para un vuelo, de acuerdo a la política que tenga el vuelo, y a la cantidad de pasajes vendidos o disponibles.
- Registrar la venta de un pasaje para un vuelo, indicando fecha y DNI del comprador. Debe registrarse también el precio establecido para el pasaje, que depende de la política que tenga el vuelo en ese momento. Si no se pueden vender pasajes, lanzar un error.
- Saber, para un vuelo, el importe total generado por venta de pasajes.
- Saber el peso máximo de un vuelo, que es la suma de estos factores:
- Peso del avión.
- Peso de los pasajeros, que es el resultado de multiplicar la cantidad de pasajeros del vuelo por el peso estándar definido por la IATA.
- Peso de la carga, que depende del tipo de vuelo.
Se pide también poder realizar las siguientes consultas, teniendo en cuenta todos los vuelos existentes:
- Saber para qué fechas, una determinada persona (que se identifica por su DNI) tiene sacado pasaje para un determinado destino. P.ej. en qué fechas la persona con DNI 74404949 tiene sacado pasaje a Tahití.
- Conocer el total de asientos libres para un destino entre dos fechas.
- Y otra más: si dos personas son compañeras, o sea, comparten al menos 3 vuelos
Los siguientes requerimientos son completamente opcionales, y requieren un poquito más de algoritmia que los demás.
Que el criterio de si se pueden vender o no pasajes pueda definirse en función de la ciudad de origen del vuelo.
Si para una ciudad hay definido un criterio particular, se usa ese, y si no el general de la empresa. Este criterio tiene que poder cambiarse (o eliminarse) en cualquier momento.
Obtener el conjunto de vuelos intercontinentales que están programados para un determinado día. Para eso, agregar al modelo la información de en qué continente está cada ciudad.
Pagar un pasaje es una operación distinta a comprarlo: primero se compra y luego se paga. De cada pago, nos interesa registrar la fecha y la hora en que se realizó y su importe. Separar, para cada pasaje, el importe total del efectivamente cobrado.
Además, nos interesa poder consultar, dado un DNI, cuál es la deuda total de esa persona - considerando los pasajes que haya comprado en todos los vuelos existentes.
Esta obra fue elaborada por Federico Aloi y publicada bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.
📝 Enunciado original creado por Carlos Lombardi.
📸 Imagen de portada por Juan Pablo Mascanfroni en Unsplash.

