2025-08-28 21:08:16 -04:00
|
|
|
package lodge.reservationsystem;
|
|
|
|
|
|
2025-08-31 18:59:49 -04:00
|
|
|
import java.io.BufferedWriter;
|
2025-08-29 10:32:10 -04:00
|
|
|
import java.io.IOException;
|
2025-08-31 18:59:49 -04:00
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
|
import java.nio.file.Files;
|
|
|
|
|
import java.nio.file.Path;
|
|
|
|
|
import java.nio.file.Paths;
|
2025-09-03 08:56:57 -04:00
|
|
|
import java.time.ZonedDateTime;
|
2025-08-31 18:59:49 -04:00
|
|
|
|
2025-09-03 16:08:44 -04:00
|
|
|
public abstract class Reservation {
|
2025-08-31 18:59:49 -04:00
|
|
|
char type;
|
2025-09-03 16:08:44 -04:00
|
|
|
String reservation_number = "-99";
|
2025-08-29 07:26:53 -04:00
|
|
|
Address physical_address;
|
|
|
|
|
Address mailing_address;
|
2025-08-28 21:08:16 -04:00
|
|
|
|
2025-09-03 08:56:57 -04:00
|
|
|
ZonedDateTime reservation_start_date;
|
|
|
|
|
ZonedDateTime reservation_end_date;
|
2025-09-03 16:08:44 -04:00
|
|
|
ReservationStatusEnum reservation_status;
|
2025-08-28 21:08:16 -04:00
|
|
|
|
2025-09-03 16:08:44 -04:00
|
|
|
KitchenEnum kitchen;
|
2025-09-04 22:34:26 -04:00
|
|
|
|
2025-08-28 21:08:16 -04:00
|
|
|
Integer numberOfBeds;
|
|
|
|
|
Integer numberOfBedRooms;
|
|
|
|
|
Integer numberOfBathRooms;
|
|
|
|
|
Integer numberOfFloors;
|
|
|
|
|
Integer squareFeet;
|
|
|
|
|
|
|
|
|
|
Float price;
|
|
|
|
|
|
2025-09-06 19:21:01 -04:00
|
|
|
Reservation() {
|
2025-09-03 16:08:44 -04:00
|
|
|
numberOfBeds = 1;
|
|
|
|
|
numberOfBedRooms = 1;
|
|
|
|
|
numberOfBathRooms = 1;
|
|
|
|
|
numberOfFloors = 1;
|
|
|
|
|
kitchen = KitchenEnum.None;
|
|
|
|
|
price = 120.0f;
|
|
|
|
|
reservation_status = ReservationStatusEnum.Draft;
|
|
|
|
|
mailing_address = null;
|
|
|
|
|
physical_address = null;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-31 18:59:49 -04:00
|
|
|
public String getReservation_number() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return reservation_number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setReservation_number(String reservation_number) {
|
|
|
|
|
this.reservation_number = reservation_number;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 07:26:53 -04:00
|
|
|
public Address physical_address() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return physical_address;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 07:26:53 -04:00
|
|
|
public void setPhysical_address(Address physical_address) {
|
2025-08-28 21:08:16 -04:00
|
|
|
this.physical_address = physical_address;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 07:26:53 -04:00
|
|
|
public Address mailing_address() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return mailing_address;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 07:26:53 -04:00
|
|
|
public void setMailing_address(Address mailing_address) {
|
2025-08-28 21:08:16 -04:00
|
|
|
this.mailing_address = mailing_address;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 08:56:57 -04:00
|
|
|
public ZonedDateTime reservation_start_date() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return reservation_start_date;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 08:56:57 -04:00
|
|
|
public void setReservation_start_date(ZonedDateTime reservation_start_date) {
|
2025-08-28 21:08:16 -04:00
|
|
|
this.reservation_start_date = reservation_start_date;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 08:56:57 -04:00
|
|
|
public ZonedDateTime reservation_end_date() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return reservation_end_date;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 08:56:57 -04:00
|
|
|
public void setReservation_end_date(ZonedDateTime reservation_end_date) {
|
2025-08-28 21:08:16 -04:00
|
|
|
this.reservation_end_date = reservation_end_date;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 16:08:44 -04:00
|
|
|
public ReservationStatusEnum reservation_status() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return reservation_status;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 16:08:44 -04:00
|
|
|
public void setReservation_status(ReservationStatusEnum reservation_status) {
|
2025-08-28 21:08:16 -04:00
|
|
|
this.reservation_status = reservation_status;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-04 22:34:26 -04:00
|
|
|
public KitchenEnum getKitchen() {
|
|
|
|
|
return kitchen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setKitchen(KitchenEnum kitchen) {
|
|
|
|
|
this.kitchen = kitchen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-08-28 21:08:16 -04:00
|
|
|
public Integer numberOfBeds() {
|
|
|
|
|
return numberOfBeds;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setNumberOfBeds(Integer numberOfBeds) {
|
|
|
|
|
this.numberOfBeds = numberOfBeds;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Integer numberOfBedRooms() {
|
|
|
|
|
return numberOfBedRooms;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setNumberOfBedRooms(Integer numberOfBedRooms) {
|
|
|
|
|
this.numberOfBedRooms = numberOfBedRooms;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Integer numberOfBathRooms() {
|
|
|
|
|
return numberOfBathRooms;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setNumberOfBathRooms(Integer numberOfBathRooms) {
|
|
|
|
|
this.numberOfBathRooms = numberOfBathRooms;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Integer numberOfFloors() {
|
|
|
|
|
return numberOfFloors;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setNumberOfFloors(Integer numberOfFloors) {
|
|
|
|
|
this.numberOfFloors = numberOfFloors;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Integer squareFeet() {
|
|
|
|
|
return squareFeet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setSquareFeet(Integer squareFeet) {
|
|
|
|
|
this.squareFeet = squareFeet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Float price() {
|
|
|
|
|
return price;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setPrice(Float price) {
|
|
|
|
|
this.price = price;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int hashCode() {
|
|
|
|
|
final int prime = 31;
|
|
|
|
|
int result = 1;
|
|
|
|
|
result = prime * result + ((reservation_number == null) ? 0 : reservation_number.hashCode());
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
|
if (this == obj)
|
|
|
|
|
return true;
|
|
|
|
|
if (obj == null)
|
|
|
|
|
return false;
|
|
|
|
|
if (getClass() != obj.getClass())
|
|
|
|
|
return false;
|
|
|
|
|
Reservation other = (Reservation) obj;
|
|
|
|
|
if (reservation_number == null) {
|
|
|
|
|
if (other.reservation_number != null)
|
|
|
|
|
return false;
|
|
|
|
|
} else if (!reservation_number.equals(other.reservation_number))
|
|
|
|
|
return false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 07:26:53 -04:00
|
|
|
@Override
|
|
|
|
|
public String toString() {
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2025-08-31 18:59:49 -04:00
|
|
|
|
2025-08-31 23:54:17 -04:00
|
|
|
sb.append(String.format("{ \"%s\":{", ReservationType()));
|
2025-08-30 11:26:49 -04:00
|
|
|
sb.append("\"reservation_type\": \"" + ReservationType() + "\",");
|
2025-08-29 07:26:53 -04:00
|
|
|
sb.append("\"reservation_number\": \"" + reservation_number + "\",");
|
|
|
|
|
sb.append("\"reservation_status\": \"" + reservation_status + "\",");
|
|
|
|
|
sb.append("\"reservation_start_date\": \"" + reservation_start_date + "\",");
|
2025-09-06 19:21:01 -04:00
|
|
|
sb.append("\"reservation_end_date\": \"" + reservation_end_date + "\",");
|
|
|
|
|
sb.append("\"physical_address\": " + physical_address + ",");
|
|
|
|
|
sb.append("\"mailing_address\": " + mailing_address + ",");
|
2025-09-04 22:34:26 -04:00
|
|
|
sb.append("\"kitchen\": \"" + kitchen + "\",");
|
2025-08-29 07:26:53 -04:00
|
|
|
sb.append("\"numberOfBeds\": \"" + numberOfBeds + "\",");
|
|
|
|
|
sb.append("\"numberOfBedRooms\": \"" + numberOfBedRooms + "\",");
|
|
|
|
|
sb.append("\"numberOfBathRooms\": \"" + numberOfBathRooms + "\",");
|
|
|
|
|
sb.append("\"numberOfFloors\": \"" + numberOfFloors + "\",");
|
|
|
|
|
sb.append("\"squareFeet\": \"" + squareFeet + "\",");
|
|
|
|
|
sb.append("\"price\": \"" + price + "\"");
|
|
|
|
|
sb.append("}}");
|
|
|
|
|
return sb.toString();
|
|
|
|
|
}
|
2025-08-31 18:59:49 -04:00
|
|
|
|
|
|
|
|
// @TODO write reservation out in json
|
|
|
|
|
public void Write(Reservation reservation) throws IOException {
|
|
|
|
|
String dataRoot = DataRepository.getPath();
|
|
|
|
|
dataRoot = dataRoot + "/rsv-" + reservation.reservation_number + ".json";
|
|
|
|
|
Path path = Paths.get(dataRoot);
|
|
|
|
|
|
|
|
|
|
try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
|
2025-08-31 23:54:17 -04:00
|
|
|
writer.write(toString());
|
2025-08-31 18:59:49 -04:00
|
|
|
writer.flush();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-04 22:34:26 -04:00
|
|
|
public void Change(Reservation reservation, ReservationStatusEnum newStatus) throws IllegalOperationException {
|
2025-09-03 16:08:44 -04:00
|
|
|
try {
|
|
|
|
|
if (reservation.reservation_status == ReservationStatusEnum.Completed) {
|
|
|
|
|
if (newStatus == ReservationStatusEnum.Canceled) {
|
2025-09-04 22:34:26 -04:00
|
|
|
throw new IllegalOperationException ("Invalid Change, reservation has completed.");
|
2025-09-03 16:08:44 -04:00
|
|
|
}
|
|
|
|
|
if (ZonedDateTime.now().compareTo(this.reservation_start_date) > -1) {
|
2025-09-04 22:34:26 -04:00
|
|
|
throw new IllegalOperationException ("Invalid Change, reservation started.");
|
2025-09-03 16:08:44 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (newStatus == ReservationStatusEnum.Completed) {
|
|
|
|
|
this.setPrice(this.calculatePrice());
|
|
|
|
|
}
|
|
|
|
|
reservation.setReservation_status(newStatus);
|
2025-09-04 22:34:26 -04:00
|
|
|
} catch (IllegalOperationException e) {
|
2025-09-03 16:08:44 -04:00
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 07:26:53 -04:00
|
|
|
public float calculatePricePerNight() {
|
2025-08-28 21:08:16 -04:00
|
|
|
return 0.0f;
|
2025-08-29 07:26:53 -04:00
|
|
|
}
|
2025-08-28 21:08:16 -04:00
|
|
|
|
2025-08-31 18:59:49 -04:00
|
|
|
public abstract String ReservationType();
|
|
|
|
|
|
2025-09-03 16:08:44 -04:00
|
|
|
public abstract float calculatePrice();
|
2025-08-31 18:59:49 -04:00
|
|
|
|
2025-09-03 16:08:44 -04:00
|
|
|
public abstract boolean checkValid() throws Exception;
|
|
|
|
|
}
|