//endrer info etter type (1=annkomst, 2=avreise, 3 = begge) void Hotell::endre(int type) { bool funnet = false; //er rommet funnet Rom* tempRom; List* tempList; Reservasjon* tempRes; string eier = les("Romeier:"); int origAnkomst = getdate("\nOriginal ankomst", timer.hent_dato()); for (int i = 0; i < 3; i++) { //for alle rom for (int j = 1; j <= rom[i]->no_of_elements(); j++) { tempRom = (Rom*)rom[i]->remove_no(j); //henter listen over reservasjoner. tempList = (List*)tempRom->getlist(); //alle reservasjonene til ett rom. for (int k = 1; k <= tempList->no_of_elements(); k++) { tempRes = (Reservasjon*)tempList->remove_no(k); //hvis det er en reservasjon for dagens dato. if (origAnkomst == tempRes->getAnkomst()) { funnet = true; cout << "\nRomnummer: " << tempRom->getid() << endl; tempRes->display(false); if (confirm("\nVil du endre denne reservasjonen?")) { if (type == 1 || type == 3) { //endrer avreisen tempRes->setAnkomst(getdate("\nNy ankomst", timer.hent_dato())); } if (type == 2 || type == 3) { //endrer avreisen tempRes->setAvreise(getdate("\nNy avreise", timer.hent_dato())); } } } //setter tilbake tempList->add(tempRes); tempRom->replaceList(tempList); } rom[i]->add(tempRom); } } if (!funnet) { cout << "\nReservasjon ikke funnet" << endl; } }
/****************************************************************************** name: void listReservationsGaps description: The inverse of listReservations -- instead of listing when the room is reserved, it lists the gaps between reservations, to display when the room is NOT reserved parameters: n/a returns: n/a ******************************************************************************/ void Rom::listReservationsGaps() { int availableFrom = tid.hent_dato(), nextArrival = 0; Reservasjon* temp = nullptr; for(int i = 1; i <= Reservations->no_of_elements(); i++) { temp = (Reservasjon*) Reservations->remove_no(i); Reservations->add(temp); if(temp->getArrival() <= availableFrom && temp->getDeparture() > tid.hent_dato()) availableFrom = temp->getDeparture(); else if(temp->getDeparture() < availableFrom) availableFrom = tid.hent_dato(); else if(temp->getArrival() > availableFrom) nextArrival = temp->getArrival(); if(nextArrival > availableFrom) cout << "\nRoom #" << temp->getRoomID() << " is available from " << availableFrom << "-" << nextArrival; availableFrom = temp->getDeparture(); } if(((availableFrom > 0 && nextArrival == 0) ||( availableFrom > 0 && nextArrival < availableFrom) && temp != nullptr)) { cout << "\nRoom #" << temp->getRoomID() << " is available from " << availableFrom; cin.get(); } }
/****************************************************************************** name: void listReservations description: Lists all reservations for this object parameters: n/a returns: n/a ******************************************************************************/ void Rom::listReservations() { for (int i = 1; i <= Reservations->no_of_elements(); i++) { Reservasjon* temp = (Reservasjon*) Reservations->remove_no(i); Reservations->add(temp); temp->display(); } }
void Hotell::displayOkkupant() { Rom* tempRom; List* tempList; Reservasjon* tempRes; bool funnetNr = false; bool funnetRes = false; int romNr; cout << "Ronmummer: "; cin >> romNr; //for alle typer rom for (int i = 0; i < 3; i++) { //for alle rom for (int j = 1; j <= rom[i]->no_of_elements(); j++) { tempRom = (Rom*)rom[i]->remove_no(j); rom[i]->add(tempRom); if (tempRom->getid() == romNr) { funnetNr = true; //henter listen over reservasjoner. tempList = (List*)tempRom->getlist(); //alle reservasjonene til ett rom. for (int k = 1; k <= tempList->no_of_elements(); k++) { tempRes = (Reservasjon*)tempList->remove_no(k); tempList->add(tempRes); //hvis det er en reservasjon for dagens dato. if (timer.hent_dato() <= tempRes->getAvreise() && timer.hent_dato() >= tempRes->getAnkomst()) { funnetRes = true; tempRes->display(true); } } } } } //hvis rommet eller reservasjonen ikke er funnet if (!funnetNr) { cout << "Romnummer ikke funnet" << endl; } else if (!funnetRes) { cout << "Ingen reservasjon i dag" << endl; } }
/****************************************************************************** name: void writeRomDataToFile(ofstream &) description: Writes data about a specific room to file: Room number Number of beds Breakfast included Reservation(s) parameters: (ofstream) & file returns: n/a ******************************************************************************/ void Rom::writeRomDataToFile(ofstream & outFile) { outFile << roomNumber << "\n" << numberOfBeds << "\n" << (breakfastIncluded ? 1 : 0 )<< "\n"; outFile << Reservations->no_of_elements() << "\n"; for (int i = 1; i <= Reservations->no_of_elements(); i++) { Reservasjon* temp = (Reservasjon*) Reservations->remove_no(i); Reservations->add(temp); temp->writeDataToFile(outFile); } }
void Hotell::ledigTidRom() { int romNr; //rommet du vil ha bool funnet = false; //er rommet funnet Rom* tempRom; List* tempList; Reservasjon* tempRes; cout << "Hvilket romnummer?" << endl; cin >> romNr; //Alle romtypene for(int i = 0; i < 3; i++) { //Alle rommene for (int j = 1; j <= rom[i]->no_of_elements(); j++) { tempRom = (Rom*)rom[i]->remove_no(j); rom[i]->add(tempRom); //hvis rommet er riktig if (romNr == tempRom->getid()) { tempList = tempRom->getlist(); funnet = true; cout << "\nRommet er opptatt i perioden(e):\n"; //hvis det ikke er noen reservasjoner if (tempList->no_of_elements() == 0) { cout << "Ingen reservasjoner" << endl; } else { //For alle reservasjonene for (int k = 1; k <= tempList->no_of_elements(); k++) { tempRes = (Reservasjon*)tempList->remove_no(k); tempList->add(tempRes); cout << '\t' << tempRes->getAnkomst() << "\t-\t" << tempRes->getAvreise() << endl; } } } } } //hvis rommet er funnet if (!funnet) { cout << "Romnummer ikke funnet." << endl; } }
/****************************************************************************** name: bool checkReservationData(string, int) description: Checks if a reservation really exist. This functions checks both the registered user AND the registered date. parameters: string name, int date returns: (int) 1 or 0 0 = reservation does NOT exist 1 = reservation exist ******************************************************************************/ bool Rom::checkReservationData(string name, int date) { for (int i = 1; i <= Reservations->no_of_elements(); i++) { Reservasjon * temp = (Reservasjon *) Reservations->remove_no(i); Reservations->add(temp); if (temp->getArrival() == date && temp->sameNameAsReservation(name)) return true; else return false; } }
Reservasjon* Rom::setReservation(int arrival, int departure, bool breakfast, bool extrabed) { // Now set up the reservation with provided arguments and names ... Reservasjon* r = new Reservasjon(roomNumber, arrival, departure); r->setExtrabedInUse(extrabed); r->setBreakfast(breakfast); // Add our reservation to our list of reservations for this room, and return it Reservations->add(r); //Reservations->display_list(); return r; }
void Hotell::utskjekking() { //filnavnet er egen variabel. ofstream fil; fil.open(filnavn+".HST"); string navn; Rom* tempRom; List* tempList; Reservasjon* tempRes; bool funnet = false; navn = les("\nUtskjekkers navn:"); //for alle rom for (int x = 0; x < 3; x++) { for (int y = 1; y <= rom[x]->no_of_elements(); y++) { //henter ut rommet tempRom = (Rom*)rom[x]->remove_no(y); rom[x]->add(tempRom); tempList = tempRom->getlist(); for (int z = 1; z <= tempList->no_of_elements(); z++) { tempRes = (Reservasjon*)tempList->remove_no(z); //hvis den er riktig if (navn == tempRes->getNavn() && timer.hent_dato() == tempRes->getAvreise()) { funnet = true; tempRes->utskjekking(fil); } else { //hvis det ikke er riktig reservasjon, sett den tilbake. tempList->add(tempRes); } } } } fil.close(); }
/** * Sjekker om rom er ledig i en tidsperiode * @param int ankomst ankomstdato * @param int avreise avreisedato * @return bool retunerer om perioden er ledig eller ikke */ bool Rom::ledig(int ankomst, int avreise) { Reservasjon* reservasjon; // Antall reservasjoner int antall_reservasjoner = reservasjoner->no_of_elements(); for(int j = 1; j <= antall_reservasjoner; j++) { reservasjon = (Reservasjon*) reservasjoner->remove_no(j); // Henter ut en reservasjon // Sjekker om perioden er ledig if(ankomst <= reservasjon->getAvreiseDato() && avreise >= reservasjon->getAnkomstDato()) return false; // Legger reservasjonen tilbake i listen over reservasjoner reservasjoner->add(reservasjon); } return true; }
/** * Skriver rommet til fil. * @param ostream* ut */ void Rom::skriv_til_fil(ostream* ut) { *ut << number << "\n" << ant_senger << "\n" << frokost_inkludert << "\n" << reservasjoner->no_of_elements() << "\n"; Reservasjon* temp; // Looper igjennom antall reservasjoner for (int i = 1; i <= reservasjoner->no_of_elements(); i++) { temp = (Reservasjon*) reservasjoner->remove_no(i); // Henter ut en reservasjon temp->skriv_til_fil(ut); // Skriver reservasjonen til fil reservasjoner->add(temp); // Legger reservasjonen tilbake i listen } }
void Hotell::avbestille(string txt){ Rom* tempRom; List *tempList; Reservasjon *tempRes; //Alle romtypene for(int x = 0; x < 3; x++){ //alle rommene for (int y = 1; y <= rom[x]->no_of_elements(); y++){ //henter ut rom. tempRom = (Rom*)rom[x]->remove_no(y); rom[x]->add(tempRom); //henter listen over reservasjoner. tempList = (List*)tempRom->getlist(); //alle reservasjonene til ett rom. for (int z = 1; z <= tempList->no_of_elements(); z ++){ //henter ut reservasjonen tempRes = (Reservasjon*)tempList->remove_no(z); //dersom det stemmer if (!tempRes->compNavn(txt)){ //skriver ut reservasjonen og spør om den skal fjernes. tempRom->display(false); tempRes->display(false); if(!confirm("\nVil du fjerne?")){ tempList->add(tempRes); } //dersom det fjernes minker z, for å kompensere for //fjernet reservasjon. else (z--); } //dersom det ikke stemmer legges reservasjonen tilbake. else { tempList->add(tempRes); } } } } }
/** * Sjekker om rommet er ledig */ bool Rom::ledig(int ankomst) { // Henter ut antall reservasjoner int antall_reservasjoner = reservasjoner->no_of_elements(); bool ledig = true; // Looper gjennom alle reservasjoner for(int i = 0; i < antall_reservasjoner; i++) { // Henter ut en reservasjon Reservasjon* reservasjon = (Reservasjon*) reservasjoner->remove_no(i); // Sjekker om tidsperioden er ledig. if(ankomst > reservasjon->getAnkomstDato() && ankomst < reservasjon->getAvreiseDato()) { ledig = false; } // Legger reservasjonen tilbake i listen med reservasjoner reservasjoner->add(reservasjon); } return ledig; // Retunerer true eller false. }
void Hotell::addRegning() { int romNr; //rommet du vil ha bool funnet = false; //er rommet funnet Rom* tempRom; List* tempList; Reservasjon* tempRes; cout << "Hvilket romnummer?" << endl; cin >> romNr; //Alle romtypene for(int i = 0; i < 3; i++) { //Alle rommene for (int j = 1; j <= rom[i]->no_of_elements(); j++) { tempRom = (Rom*)rom[i]->remove_no(j); //hvis rommet er riktig if (romNr == tempRom->getid()) { tempList = tempRom->getlist(); //for alle reservasjoner for (int j = 0; j < tempList->no_of_elements(); j++) { tempRes = (Reservasjon*)tempList->remove_no(j); if (tempRes->getAnkomst() <= timer.hent_dato() && tempRes->getAvreise() >= timer.hent_dato()) { funnet = true; //legg inn ting. tempRes->addRegning(); tempList->add(tempRes); tempRom->replaceList(tempList); } } } rom[i]->add(tempRom); } } }
void Rom::reservationByName(std::string name, int action) { for (int i = 1; i <= Reservations->no_of_elements(); i++) { Reservasjon* temp = (Reservasjon*) Reservations->remove_no(i); if (temp->sameNameAsReservation(name)) { temp->display(); // If this method was called with action set to REMOVE, // ask the user whether or not to remove the reservation. if(action == REMOVE && readChar("Delete reservation?", 'y','n') == 'y') { Reservations->destroy(temp->getArrival()); } // If the action is set to CHECKIN, and today is the expected arrival date, and the user answers "y" to "Check-in?", // then set checkin timestamp to current datetime by passing no parameters to setCheckin. else if(action == CHECKIN && temp->getArrival() == tid.hent_dato() && readChar("Check-in?",'y','n') == 'y') { temp->setCheckin(); Reservations->add(temp); } else Reservations->add(temp); } else { Reservations->add(temp); } } }
void Hotell::ledigeRom(int nr) { //midlertidlige variabler Rom* tempRom; List* tempResList; Reservasjon* tempRes; bool opptatt = false; //hvilket tidsrom vil du finne? int minDate = getdate("\nFra dato: ", timer.hent_dato()); int maxDate = getdate("\nTil dato: ", minDate); //for alle rom av typen 'nr' for (int i = 1; i <= rom[nr]->no_of_elements(); i++) { tempRom = (Rom*)rom[nr]->remove_no(i); rom[nr]->add(tempRom); tempResList = (List*)tempRom->getlist(); //for alle reservasjoner for (int j = 1; j <= tempResList->no_of_elements(); j++) { tempRes = (Reservasjon*)tempResList->remove_no(j); tempResList->add(tempRes); //hvis reservasjonen gjelder for if (!(maxDate < tempRes->getAnkomst() || minDate > tempRes->getAvreise())) { opptatt = true; } } //hvis dette rommet ikke er opptatt if (!opptatt) { //skriv ut romnr cout << tempRom->getid() << ' '; } } }
void Hotell::displayResEier() { Rom* tempRom; List* tempList; Reservasjon* tempRes; string navn = les("Eierens navn:"); //for alle typer rom for (int i = 0; i < 3; i++) { //for alle rom for (int j = 1; j <= rom[i]->no_of_elements(); j++) { tempRom = (Rom*)rom[i]->remove_no(j); rom[i]->add(tempRom); //henter listen over reservasjoner. tempList = (List*)tempRom->getlist(); //alle reservasjonene til ett rom. for (int k = 1; k <= tempList->no_of_elements(); k++) { tempRes = (Reservasjon*)tempList->remove_no(k); tempList->add(tempRes); if (navn == tempRes->getNavn()) { cout << tempRom->getid() << ' '; } } } } cout << endl; }
/****************************************************************************** name: isReserved() description: Checks if the room is booked on (or between) certain dates parameters: int date, int nights return: (bool) 0 = room is not reserved 1 = room is reserved ******************************************************************************/ bool Rom::isReserved(int date, int nights) { // If we have no reservations at all, there's no need to check ... if(Reservations->is_empty()) return false; // We use a tm timestruct to make SURE our dates are correct when iterating later on... struct tm time; int correctedTime; // Lets set up that time struct... time.tm_year = date / 10000; time.tm_mon = (date % (time.tm_year * 10000)) / 100; time.tm_mday = (date % (time.tm_year * 10000)) % 100; time.tm_hour = 12; time.tm_min = 0; time.tm_sec = 0; mktime(&time); // Loop through the list from end to beginning for(int i = Reservations->no_of_elements(); i > 0; i--) { // ... and remove each element, one at the time ... Reservasjon* r = (Reservasjon*) Reservations->remove_no(i); // Now, if nights-parameter is set, we must check the status of the room // for several days ... if(nights > 0) { // Increment date by 1 ... for(int k=1; k<=nights; k++) { // Increment tm_mday, then run mktime to correct potentially invalid values time.tm_mday++; mktime(&time); // ... and now, format that to YYYYMMDD :) correctedTime = (time.tm_year * 10000) + (time.tm_mon * 100) + time.tm_mday; // If this new time value is a value between the arrival and departure value of the reservation, // that would imply the room is already booked on that day ... if(correctedTime >= r->getArrival() && correctedTime <= r->getDeparture()) { // ... and put our reservation back in the list... Reservations->add(r); // If it's booked, just return -- no point in continuing return true; } } } else if(date >= r->getArrival() && date <= r->getDeparture()) { // ... and put our reservation back in the list... Reservations->add(r); // If it's booked, just return -- no point in continuing return true; } } return false; }
Reservasjon* Rom::reservationByDate(int date, int action) { extern Hotell* hotellet; for (int i = 1; i <= Reservations->no_of_elements(); i++) { Reservasjon* temp = (Reservasjon*) Reservations->remove_no(i); // If this method was called with action CHECKOUT and departure date is the provided date for the reservation, // or action was checkin and arrival date is the date of this reservation, then return the reservation if ((action == CHECKOUT) || (action == CHECKIN && temp->getArrival() == date)) { // If action is checkout, destroy reservation, and create a temporary reservation object with errorcode // "reservation has been pruned" to be returned if(action == CHECKOUT && temp->getDeparture() == date) { temp->display(); if(readChar("Confirm checkout?",'y','n')=='y') { // Get filename, subtract file ending and apply new filename std::string hotellHst = hotellet->getFilename().substr(0, hotellet->getFilename().size()-4); hotellHst += ".hst"; // ... aaaand output! std::ofstream o(hotellHst.c_str(), std::ios::out|ios::app); temp->writeDataToFile(o); Reservations->destroy(temp->getRoomID()); temp = new Reservasjon(reservationHasBeenPruned); } // Otherwise, put it back in the list else Reservations->add(temp); } // If action is checkout, and a reservation on the room is current, but departure on reservation is not today, // ask if we want to check him out earlier than planned, and if so, call this method with his/her planned // departure date else if(action == CHECKOUT && temp->getDeparture() >= date && temp->getArrival() <= date) { std::cout << "\nGuest in room " << temp->getRoomID() << " is not meant to check out until " << temp->getDeparture(); if(readChar("\nCheck out anyways?",'y','n') == 'y') { Reservations->add(temp); return reservationByDate(temp->getDeparture(), CHECKOUT); } } // If action is check in, ask for confirmation to check in, and display information about the reservation else if(action == CHECKIN && readChar("Check-in?",'y','n') == 'y') { temp->display(); temp->setCheckin(); Reservations->add(temp); } // Otherwise, put it back in our list else { Reservations->add(temp); } return temp; } // If the method was called with NOOP action, as in NO OPeration, display the data without modifying it; essentially the same as // checkin, except it ONLY displays data about the reservation, and date may be any date within the time period of the reservation, // as opposed to requiring a specific checkin date. It does however require guests to be checked in. else if (action == NOOP && temp->getDeparture() >= date && temp->getArrival() <= date && temp->getInUse() == true) { //temp->display(roomNumber); Reservations->add(temp); return temp; } } // If no matching reservation was found, return a new reservations object, with // roomID containing the errorcode return new Reservasjon(reservationDoesNotExist); }
/****************************************************************************** name: void editReservation(string, int) description: Edit a reservation. If possible, you can change the arrival and/or departure date. parameters: (string) name, (int) date returns: n/a ******************************************************************************/ void Rom::editReservation(string name, int date) { extern Timer tid; int todaysDate = tid.hent_dato(); int newDate; char userCommand; for (int i = 1; i <= Reservations->no_of_elements(); i++) { Reservasjon * temp = (Reservasjon *) Reservations->remove_no(i); if (temp->getArrival() == date && temp->sameNameAsReservation(name)) { if (temp->getInUse() == 0) { cout << "\nAvailable choices:"; cout << "\n\t 1) Change arrival date"; cout << "\n\t 2) Change departure date"; cout << "\n\t Q) QUIT"; userCommand = readCommand(); switch(userCommand) { case '1': { do { // Gir "kunde" den allerede registrerte datoen, i // tilfellet ikke ledig i andre tidsperioder. // (For å hindre en loop man ikke kommer seg ut av) cout << "Arrival date already registered: " << temp->getArrival() << "\n"; cout << "\nEnter the new arrival date: "; cin >> newDate; cin.ignore(); // Check if room is reserved between the new date and deparature. } while (this->isReserved(newDate, tid.forskjell_datoer(newDate, date))); temp->setArrival(newDate); cout << "\nNotice: Arrival date has been updated.\n"; cin.get(); break; } case '2': { do { // Gir "kunde" den allerede registrerte datoen, // i tilfellet ikke ledig i andre tidsperioder. // (For å hindre en loop man ikke kommer seg ut av) cout << "The departure date already registered: " << temp->getDeparture() << "\n"; cout << "\nEnter the new departure date: "; cin >> newDate; cin.ignore(); } while (this->isReserved( temp->getArrival(), tid.forskjell_datoer(temp->getArrival(), newDate)) ); temp->setDeparture(newDate); cout << "\nNotice: Departure date has been updated.\n"; cin.get(); break; } } } else if(temp->getInUse() == 1) { cout << "\nAvailable choices:"; cout << "\n\t 1) Change departure date"; cout << "\n\t Q) QUIT"; userCommand = readCommand(); } else { cout << "Error: Can't change arrival date. This person has already checked in.\n"; cout << "Press any key to continue"; cin.get(); } }