Excelente Reto, hay que estar bien atento a las indicaciones de la guia y en especial tener un poco de logica para interpretar, ya que implicitamente debemos descontar el capacity una vez que se venda algun ticket del Flight.
import{Flight}from'./Flight';import{Reservation}from'./Reservation';exportclassEconomicFlightextendsFlight{// Override to apply logicaddFlightToPassenger(passenger){if(passenger.age<18|| passenger.age>65){this.price*=0.8;} passenger.addFlight(this);}}
Muy bien, pero deberias realizar una copia del precio en el vuelo Economico, ya que si compras mas de una vez un ticket, el precio quedara con el descuento anterior.
Buen detalle David, es cierto menos mal el test no validaba una compra mas. Voy a tomarlo en cuenta para optimizar esa parte. En un momento tb le doy una revisada al tuyo. exitos
Escudo anti-spoilers
!Imagen anti-spoilers
Muy entretenido el reto, y se vuelve muy fácil cuando se tiene los conocimientos de los cursos recomendados en el post del reto #PlatziChallenge: 30 días de JavaScript
A continuación comparto mi solución 😎
EconomicFlight.js
En este módulo es importante considerar que si hacemos algún cambio directo el precio como lo hizo @luisgv94, las próximas iteraciones, el precio del vuelo no será el correcto, es por ello que agregué una variable auxiliar que me permite recuperar el precio anterior.
Aquí no sé si hice un poco de trampa, pero al no ser clara las instrucciones también es posible agregar directamente el precio de specialService a la variable this.price y así nos evitamos sobreescribir el método addFlightToPassenger
Aquí solamente considerar bien los nombres de variables como reservedByfullName, etc.
exportclassReservation{constructor(flight, passenger){// Tu código aquí 👈this.flight= flight;this.passenger= passenger;}reservationDetails(){// Tu código aquí 👈return{origin:this.flight.origin,destination:this.flight.destination,date:this.flight.date,reservedBy:`${this.passenger.name}${this.passenger.lastName}`,};}}
NUNCA PARES DE APRENDER!
Excelente amigo David. Me parecio un trucazo tu hack hehe para el de PremiumFlight. Ahi ajuste y subi una nueva solucion. Saludos
Oigame, Oigame, Oigame, un fuerte aplauso para todos los que hemos llegado aquí, y hemos luchado contra nosotros mismos para lograr estos lindos desafíos que nos ha dado Platzi.
Quiero recalcar, que si capacidad es igual a 0 no se debe retornar nada, es decir, undefined... ahora sí, dejo mi código... espero que les sirva, como a mi me ha servido algunos de ustedes... :)
exportclassFlight{constructor(origin, destination, date, capacity, price){this.origin= origin;this.date= date;this.destination= destination;this.capacity= capacity;this.price= price;this.passengers=[];}sellTicket(passenger){// Tu código aquí 👇if(this.capacity>0){let res ={origin:this.origin,destination:this.destination,date:this.date,price:this.price}this.capacity--;let reservation =newReservation(res, passenger);this.passengers.push(reservation.full); passenger.flights.push(res)//agregar el vueloreturn reservation
}}}
exportclassPassenger{constructor(name, lastName, age){this.name= name
this.lastName= lastName
this.age= age
this.flights=[]}addFlight(origin, destination, date, price){this.flights.push({'origin': origin,'destination': destination,'date': date,'price': price
})}}
Flight.js
import{Reservation}from"./Reservation";exportclassFlight{constructor(origin, destination, date, capacity, price){this.origin= origin
this.destination= destination
this.date= date
this.capacity= capacity
this.price= price
this.passengers=[]}sellTicket(passenger,price=this.price){if(this.capacity>0){ passenger.addFlight(this.origin,this.destination,this.date, price)this.passengers.push({'age':passenger.age,'fullName': passenger.name+" "+ passenger.lastName,})this.capacity--//Para que no se modifique el precio original del vuelo al aplicar descuentoslet temp =this temp.price= price
returnnewReservation(temp,passenger)}}}
Debido a que aun no se puede editar los comentarios hehe (ya creo que es hora) voy a subir una actualizacion de mi solucion propuesta con creditos y agradecimientos especiales a @DavidOchoa. Pues si es necesario no modificar la propiedad price del EconomicFlight cada vez que se venda algun ticket. Por ello en el metodo que propuse addFlightToPassenger() estoy haciendo una copia del objeto this que representa al Flight y asi evito modicar el precio cuando se cree la reservacion una vez vendido el ticket de avion.
.
.
.
.
Buenísimo el ejercicio, la verdad excelente para practicar. Lamentablemente la redacción de estos retos son un dolor de cabeza..
Aqui mi solución:
A mi de da un error que no encuentro cual es porque comparo mi codigo con la solucion y mas alla de ciertos cambios de variables no encuentro la explicacion al siguiente mensaje de error de las pruebas solo para esto y el resto bien
Should add a flight to passenger
expect(received).toEqual(expected)// deep equality-Expected-0+Received+6Array[Object{"date":"2022-01-01","destination":"Guadalajara","origin":"CDMX","price":1000,},+Object{+"date":"2022-01-01",+"destination":"Guadalajara",+"origin":"CDMX",+"price":1000,+},]
El error dice que no estas agregando al pasajero su vuelo, la clase pasajero tiene que tener un arreglo que se llama flights y cada que vendas un tiquete o se llame al método sellTicket de cualquiera de las clases de debe agregar el vuelo a ese arreglo, y ese vuelo solo debe de tener esos argumentos
origin
destination
date
price
pero es un poco difícil saber si es que no lo estas agregando o lo estas agregando mal o la variable tiene un error de que las variables no se llamen igual, asi que si nos puedes mostrar el código te podría ayudar mejor
Muy interesante el reto, me pasó que solo hasta ver las pruebas unitarias caí en cuenta de disminuir la cantidad de asientos disponibles del vuelo.
Otro detalle es evitar modificar el precio original del vuelo por aplicar un descuento o un aumento de precio por vuelo premium.
Mi solución 💚
Cuidado con la lógica de disminuir la capacidad y también vean los ejemplos para ver que se espera que se agregue del pasajero en el vuelo (ya que yo cometí el error de pasar toda la referencia jaja 😅)
!LadyGaga
exportclassReservation{constructor(flight, passenger){// Tu código aquí 👈this.flight= flight;this.passenger= passenger;}reservationDetails(){// Tu código aquí 👈return{flightDetails:this.flight,passenger:this.passenger,};}}
Flight.js
import{Reservation}from"./Reservation.mjs";exportclassFlight{constructor(origin, destination, date, capacity, price){// Tu código aquí 👈this.origin= origin;this.destination= destination;this.date= date;this.capacity= capacity;this.price= price;this.passengers=[];}sellTicket(passenger){// Tu código aquí 👈if(this.capacity>0){// Add passenger and reduce capacity by each indivudialthis.passengers.push({fullName:`${passenger.name}${passenger.lastName}`,age: passenger.age,});this.capacity-=1;// Add flight to passenger's data passenger.flights.push({origin:this.origin,destination:this.destination,date:this.date,price:this.price,});returnnewReservation(this, passenger);}}}
Passenger.js
exportclassPassenger{// Tu código aquí 👈constructor(name, lastName, age){this.name= name;this.lastName= lastName;this.age= age;this.flights=[];}}
PremiumFlight.js
import{Flight}from"./Flight.mjs";import{Reservation}from"./Reservation.mjs";exportclassPremiumFlightextendsFlight{constructor(origin, destination, date, capacity, price){super(origin, destination, date, capacity, price);this.passengers=[];this.specialService=1.2;}sellTicket(passenger){if(this.capacity>0){// Add passenger and reduce capacity by each indivudialthis.passengers.push(passenger);this.capacity-=1;// Add flight to passenger's data passenger.flights.push({origin:this.origin,destination:this.destination,date:this.date,price:(this.price*=this.specialService),});returnnewReservation(this, passenger);}}}
EconomicFlight.js
import{Flight}from"./Flight.mjs";import{Reservation}from"./Reservation.mjs";exportclassEconomicFlightextendsFlight{constructor(origin, destination, date, capacity, price){super(origin, destination, date, capacity, price);this.passengers=[];}sellTicket(passenger){if(this.capacity>0){// Check passenger's age for discountconst hasDiscountPrice = passenger.age<18|| passenger.age>65;// Add passenger and reduce capacity by each indivudialthis.passengers.push(passenger);this.capacity-=1;// Add flight to passenger's data passenger.flights.push({origin:this.origin,destination:this.destination,date:this.date,price: hasDiscountPrice ?(this.price*=0.8):this.price,});returnnewReservation(this, passenger);}}}