Skip to content

Commit 6b69202

Browse files
committed
check for valid appointments
1 parent 207c9fe commit 6b69202

File tree

10 files changed

+85
-29
lines changed

10 files changed

+85
-29
lines changed
52 Bytes
Binary file not shown.
-256 Bytes
Binary file not shown.
46 Bytes
Binary file not shown.
988 Bytes
Binary file not shown.
1.05 KB
Binary file not shown.

src/controller/AddAppointmentController.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public void initialize(URL url, ResourceBundle rb) {
3131
customerDropdown.setItems(CustomerDao.getCustomerNameList());
3232
startDatePicker.setValue(LocalDate.now());
3333
endDatePicker.setValue(LocalDate.now());
34-
startText.setText("00:00");
35-
endText.setText("01:00");
34+
startText.setText("08:00:00");
35+
endText.setText("21:59:59");
3636
}
3737

3838
@FXML
@@ -109,15 +109,16 @@ void onActionSaveButton(ActionEvent event) {
109109
appointment.setEnd(endTimestamp);
110110
appointment.setCustomerId(customerId);
111111

112-
Boolean result = AppointmentDao.addAppointment(appointment);
113-
114-
if (result) {
115-
stage = (Stage) ((Button) event.getSource()).getScene().getWindow();
116-
scene = FXMLLoader.load(getClass().getResource("/view/MainMenu.fxml"));
117-
stage.setScene(new Scene(scene));
118-
stage.show();
119-
} else {
120-
Warning.generateMessage("Invalid Inputs, try again", Alert.AlertType.ERROR);
112+
if (AppointmentDao.isValidAppointment(appointment)) {
113+
Boolean result = AppointmentDao.addAppointment(appointment);
114+
if (result) {
115+
stage = (Stage) ((Button) event.getSource()).getScene().getWindow();
116+
scene = FXMLLoader.load(getClass().getResource("/view/MainMenu.fxml"));
117+
stage.setScene(new Scene(scene));
118+
stage.show();
119+
} else {
120+
Warning.generateMessage("Invalid Inputs, try again", Alert.AlertType.ERROR);
121+
}
121122
}
122123
} catch (Exception e) {
123124
e.printStackTrace();

src/controller/MainMenuController.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,6 @@ void onActionReportsButton(ActionEvent event) {
214214
@FXML
215215
void onActionDatePicker(ActionEvent event) {
216216
selectedDate = Timestamp.valueOf(datePicker.getValue().atStartOfDay());
217-
System.out.println(selectedDate);
218-
System.out.println(TimezoneUtil.timestampWithOffset(selectedDate, TimezoneUtil.getOffsetToLocalTime()));
219217
String selectedFilter = ((RadioButton)viewToggle.getSelectedToggle()).getText();
220218
calendarTableView.setItems(AppointmentDao.getAppointmentList(selectedFilter));
221219
}

src/controller/ModifyAppointmentController.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,17 @@ void onActionSaveButton(ActionEvent event) {
142142
appointment.setStart(startTimestamp);
143143
appointment.setEnd(endTimestamp);
144144
appointment.setCustomerId(customerId);
145-
Boolean result = AppointmentDao.updateAppointment(appointment);
146-
147-
if (result) {
148-
stage = (Stage) ((Button) event.getSource()).getScene().getWindow();
149-
scene = FXMLLoader.load(getClass().getResource("/view/MainMenu.fxml"));
150-
stage.setScene(new Scene(scene));
151-
stage.show();
152-
} else {
153-
Warning.generateMessage("Invalid Inputs, try again", Alert.AlertType.ERROR);
145+
146+
if (AppointmentDao.isValidAppointment(appointment)) {
147+
Boolean result = AppointmentDao.updateAppointment(appointment);
148+
if (result) {
149+
stage = (Stage) ((Button) event.getSource()).getScene().getWindow();
150+
scene = FXMLLoader.load(getClass().getResource("/view/MainMenu.fxml"));
151+
stage.setScene(new Scene(scene));
152+
stage.show();
153+
} else {
154+
Warning.generateMessage("Invalid Inputs, try again", Alert.AlertType.ERROR);
155+
}
154156
}
155157
} catch (Exception e) {
156158
e.printStackTrace();

src/dao/AppointmentDao.java

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import controller.MainMenuController;
44
import javafx.collections.FXCollections;
55
import javafx.collections.ObservableList;
6+
import javafx.scene.control.Alert;
67
import model.Appointment;
78
import utils.DBConnection;
89
import utils.DBQuery;
910
import utils.TimezoneUtil;
11+
import utils.Warning;
1012

1113
import java.sql.*;
1214

@@ -20,9 +22,8 @@ public AppointmentDao() {
2022
public static ObservableList<Appointment> getAppointmentList(String selectedFilter) {
2123
Timestamp selectedDate = MainMenuController.getSelectedDate();
2224
String sqlStatement = "SELECT *, Start + INTERVAL ? HOUR as Local_Start, End + INTERVAL ? HOUR as Local_End FROM appointments";
23-
2425
try {
25-
switch(selectedFilter) {
26+
switch (selectedFilter) {
2627
case "View Month":
2728
sqlStatement += " WHERE MONTH(Start) = ? AND YEAR(Start) = ?";
2829
DBQuery.setPreparedStatement(connection, sqlStatement);
@@ -31,13 +32,14 @@ public static ObservableList<Appointment> getAppointmentList(String selectedFilt
3132
sqlStatement += " WHERE WEEK(Start) = WEEK(?) AND YEAR(Start) = ?";
3233
break;
3334
}
35+
sqlStatement += " ORDER BY Start ASC";
3436

3537
DBQuery.setPreparedStatement(connection, sqlStatement);
3638
PreparedStatement preparedStatement = DBQuery.getPreparedStatement();
3739
preparedStatement.setInt(1, TimezoneUtil.getOffsetToLocalTime());
3840
preparedStatement.setInt(2, TimezoneUtil.getOffsetToLocalTime());
3941

40-
switch(selectedFilter) {
42+
switch (selectedFilter) {
4143
case "View Month":
4244
preparedStatement.setInt(3, selectedDate.toLocalDateTime().getMonthValue());
4345
preparedStatement.setInt(4, selectedDate.toLocalDateTime().getYear());
@@ -94,8 +96,8 @@ public static Boolean addAppointment(Appointment appointment) {
9496
preparedStatement.setString(3, appointment.getLocation());
9597
preparedStatement.setInt(4, appointment.getContactId());
9698
preparedStatement.setString(5, appointment.getType());
97-
preparedStatement.setTimestamp(6, TimezoneUtil.timestampWithOffset(appointment.getStart(), -TimezoneUtil.getOffsetToLocalTime()));
98-
preparedStatement.setTimestamp(7, TimezoneUtil.timestampWithOffset(appointment.getEnd(), -TimezoneUtil.getOffsetToLocalTime()));
99+
preparedStatement.setTimestamp(6, appointment.getStart());
100+
preparedStatement.setTimestamp(7, appointment.getEnd());
99101
preparedStatement.setInt(8, appointment.getCustomerId());
100102

101103
preparedStatement.execute();
@@ -149,4 +151,40 @@ public static void deleteAppointment(int id) {
149151
public void setAppointmentList(ObservableList<Appointment> appointmentList) {
150152
this.appointmentList = appointmentList;
151153
}
152-
}
154+
155+
private static Boolean hasAppointmentConflicts(Appointment appointment) {
156+
String selectStatement = "SELECT Local_Start, Local_End " +
157+
"FROM (SELECT Start + INTERVAL ? HOUR as Local_Start, End + INTERVAL ? HOUR as Local_End " +
158+
"FROM appointments " +
159+
"WHERE Customer_ID = ?) LocalTimeTable " +
160+
"WHERE Local_Start < ? " +
161+
"AND Local_End > ?";
162+
163+
try {
164+
DBQuery.setPreparedStatement(connection, selectStatement);
165+
PreparedStatement preparedStatement = DBQuery.getPreparedStatement();
166+
167+
preparedStatement.setInt(1, TimezoneUtil.getOffsetToLocalTime());
168+
preparedStatement.setInt(2, TimezoneUtil.getOffsetToLocalTime());
169+
preparedStatement.setInt(3, appointment.getCustomerId());
170+
preparedStatement.setTimestamp(4, appointment.getEnd());
171+
preparedStatement.setTimestamp(5, appointment.getStart());
172+
173+
preparedStatement.execute();
174+
ResultSet resultSet = preparedStatement.getResultSet();
175+
176+
if (resultSet.next()) {
177+
Warning.generateMessage("Schedule Conflict with appointment(s)", Alert.AlertType.ERROR);
178+
return true;
179+
}
180+
181+
} catch (SQLException e) {
182+
e.printStackTrace();
183+
}
184+
return false;
185+
}
186+
187+
public static Boolean isValidAppointment(Appointment appointment) {
188+
return (!hasAppointmentConflicts(appointment) && TimezoneUtil.isOfficeHours(appointment));
189+
}
190+
}

src/utils/TimezoneUtil.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package utils;
22

3+
import javafx.scene.control.Alert;
4+
import model.Appointment;
5+
36
import java.sql.Timestamp;
47
import java.time.*;
58

@@ -15,11 +18,25 @@ static public Timestamp timestampFormatter(LocalDate localDate, String localTime
1518
}
1619

1720
static public int getOffsetToLocalTime() {
18-
return ZonedDateTime.now().getOffset().getTotalSeconds()/(60*60);
21+
return ZonedDateTime.now().getOffset().getTotalSeconds() / (60 * 60);
1922
}
2023

2124
static public Timestamp timestampWithOffset(Timestamp timestamp, int offset) {
2225
LocalDateTime ldt = timestamp.toLocalDateTime().plusHours(offset);
2326
return Timestamp.valueOf(ldt);
2427
}
28+
29+
static private Boolean checkTimestampRange(Timestamp localTime) {
30+
Timestamp utcTimestamp = timestampWithOffset(localTime, -getOffsetToLocalTime());
31+
Timestamp estTimestamp = timestampWithOffset(utcTimestamp, -5);
32+
return (estTimestamp.toLocalDateTime().getHour() >= 22 || estTimestamp.toLocalDateTime().getHour() < 8) ? false : true;
33+
}
34+
35+
static public Boolean isOfficeHours(Appointment appointment) {
36+
Boolean result = checkTimestampRange(appointment.getStart()) && checkTimestampRange((appointment.getEnd()));
37+
if (!result) {
38+
Warning.generateMessage("Outside of Working Hours! (8AM-10PM EST)", Alert.AlertType.ERROR);
39+
}
40+
return result;
41+
}
2542
}

0 commit comments

Comments
 (0)