Skip to content

Commit cf58378

Browse files
authored
Merge pull request #6 from CSCE315-Spring23/add-frequently-together
Add frequently together
2 parents e342705 + 4957895 commit cf58378

File tree

3 files changed

+103
-7
lines changed

3 files changed

+103
-7
lines changed

src/main/ManagerController.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class ManagerController {
2626
ObservableList<ObservableList<String>> excessReportData = FXCollections.observableArrayList();
2727
ObservableList<ObservableList<String>> menuData = FXCollections.observableArrayList();
2828
ObservableList<ObservableList<String>> salesReportData = FXCollections.observableArrayList();
29+
ObservableList<ObservableList<String>> salesFrequentReportData = FXCollections.observableArrayList();
2930
ObservableList<ObservableList<String>> xReportData = FXCollections.observableArrayList();
3031
ObservableList<ObservableList<String>> zReportData = FXCollections.observableArrayList();
3132

@@ -45,6 +46,8 @@ public class ManagerController {
4546
@FXML
4647
private TableView salesReportTableView;
4748
@FXML
49+
private TableView salesFrequentReportTableView;
50+
@FXML
4851
private TableView excessReportTableView;
4952

5053
@FXML
@@ -299,6 +302,56 @@ private void inventoryChangeMinAmt(ActionEvent event) {
299302
}
300303
}
301304

305+
/**
306+
* Generates a sales report of what frequently bought together as pairs based on
307+
* the selected start and end dates.
308+
*
309+
* If no dates are selected or the start date is after the end date, an error
310+
* message is displayed.
311+
*
312+
* @param event the ActionEvent triggered by clicking the "Generate Frequent
313+
* Sales Report" button
314+
*/
315+
@FXML
316+
private void generateFrequentSalesReport(ActionEvent event) {
317+
System.out.println("Manager has tried to generate a Sales Report");
318+
319+
salesFrequentReportTableView.getItems().clear();
320+
salesFrequentReportTableView.getColumns().clear();
321+
Alert a = new Alert(AlertType.NONE);
322+
323+
// Error handling
324+
if (startDatePicker.getValue() == null || endDatePicker.getValue() == null) {
325+
System.out.println("Error: No dates selected");
326+
a.setAlertType(AlertType.ERROR);
327+
a.setContentText("Error: No dates selected");
328+
a.show();
329+
return;
330+
}
331+
if (startDatePicker.getValue().isAfter(endDatePicker.getValue())) {
332+
System.out.println("Start date is after end date");
333+
a.setAlertType(AlertType.ERROR);
334+
a.setContentText("Error: Start date is after end date");
335+
a.show();
336+
return;
337+
}
338+
if (startDatePicker.getValue().isEqual(endDatePicker.getValue())) {
339+
System.out.println("Start date is equal to end date");
340+
a.setAlertType(AlertType.ERROR);
341+
a.setContentText("Error: Start date is equal to end date");
342+
a.show();
343+
return;
344+
}
345+
LocalDate startDate = startDatePicker.getValue();
346+
LocalDate endDate = endDatePicker.getValue();
347+
setTableResult(
348+
db.generateFrequentSalesReport(
349+
startDate.toString() + " 00:00:00",
350+
endDate.toString() + " 23:59:59"),
351+
salesFrequentReportData,
352+
salesFrequentReportTableView);
353+
}
354+
302355
/**
303356
* Handles the action event for adding a new menu item to the menu table.
304357
* Parses the input name, ID, class, and price from the corresponding fields,

src/main/jdbcpostgreSQL.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,31 @@ public ResultSet getSalesReport(Date startTime, Date endTime) {
574574
return r;
575575
}
576576

577+
/*
578+
* Given a time window, display a list of pairs of menu
579+
* items that sell together often, popular or not, sorted by most frequent.
580+
*
581+
* @param startTime The start time of the time window
582+
*
583+
* @param endTime The end time of the time window
584+
*
585+
* @return A ResultSet containing the sales report
586+
*/
587+
public ResultSet generateFrequentSalesReport(String startTime, String endTime) {
588+
ResultSet r = null;
589+
try {
590+
Statement stmt = conn.createStatement();
591+
String sqlStatement = "select t1.firstitem, t1.seconditem, t1.concat as menuitemstogether, COUNT(t1.concat) from (SELECT a.menuitemid as firstitem, b.menuitemid as seconditem, a.orderid, CONCAT(a.menuitemid, ' ', b.menuitemid) FROM orderlineitems a JOIN orderlineitems b ON a.orderid = b.orderid and a.menuitemid < b.menuitemid) t1 INNER JOIN (select orders.ordertime, orders.orderid from orders where orders.ordertime between '"
592+
+ startTime + "' AND '" + endTime
593+
+ "' group by orders.orderid) t2 ON t1.orderid = t2.orderid GROUP BY t1.firstitem, t1.seconditem, t1.concat ORDER BY COUNT(t1.concat) DESC;";
594+
System.out.println(sqlStatement);
595+
r = stmt.executeQuery(sqlStatement);
596+
} catch (Exception e) {
597+
System.out.println(e.getMessage());
598+
}
599+
return r;
600+
}
601+
577602
/**
578603
* Retrieves a result set containing the X report for the most recent day.
579604
*

src/main/manager.fxml

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<DatePicker fx:id="endDatePicker" layoutX="291.0" layoutY="12.0" />
4040
<Label layoutX="14.0" layoutY="16.0" text="Start:" />
4141
<Label layoutX="254.0" layoutY="17.0" text="End:" />
42-
<TableView fx:id="salesReportTableView" layoutX="14.0" layoutY="47.0" prefHeight="306.0" prefWidth="551.0">
42+
<TableView fx:id="salesReportTableView" layoutX="14.0" layoutY="47.0" prefHeight="380.0" prefWidth="551.0">
4343
<columns>
4444
<TableColumn prefWidth="0" text="" />
4545
</columns>
@@ -52,7 +52,7 @@
5252
<content>
5353
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
5454
<children>
55-
<TableView layoutX="14.0" layoutY="14.0" prefHeight="335.0" prefWidth="552.0" fx:id="xReportTableView">
55+
<TableView layoutX="14.0" layoutY="14.0" prefHeight="400.0" prefWidth="552.0" fx:id="xReportTableView">
5656
<columns>
5757
<TableColumn prefWidth="0" text="" />
5858
</columns>
@@ -65,20 +65,20 @@
6565
<content>
6666
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
6767
<children>
68-
<TableView fx:id="zReportTableView" layoutX="14.0" layoutY="14.0" prefHeight="341.0" prefWidth="542.0">
68+
<TableView fx:id="zReportTableView" layoutX="14.0" layoutY="14.0" prefHeight="400.0" prefWidth="552.0">
6969
<columns>
7070
<TableColumn prefWidth="0" text="" />
7171
</columns>
7272
</TableView>
73-
<Button fx:id="zReportButton" layoutX="616.0" layoutY="41.0" mnemonicParsing="false" onAction="#generateZReport" text="Generate Z Report" />
73+
<Button fx:id="zReportButton" layoutX="623.0" layoutY="43.0" mnemonicParsing="false" onAction="#generateZReport" text="Generate Z Report" />
7474
</children></AnchorPane>
7575
</content>
7676
</Tab>
7777
<Tab text="Excess Report">
7878
<content>
7979
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
8080
<children>
81-
<TableView fx:id="excessReportTableView" layoutX="14.0" layoutY="43.0" prefHeight="311.0" prefWidth="549.0">
81+
<TableView fx:id="excessReportTableView" layoutX="14.0" layoutY="43.0" prefHeight="380.0" prefWidth="549.0">
8282
<columns>
8383
<TableColumn prefWidth="0" text="" />
8484
</columns>
@@ -93,7 +93,7 @@
9393
<content>
9494
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
9595
<children>
96-
<TableView fx:id="restockReportTableView" layoutX="14.0" layoutY="14.0" prefHeight="412.0" prefWidth="579.0">
96+
<TableView fx:id="restockReportTableView" layoutX="14.0" layoutY="14.0" prefHeight="400.0" prefWidth="579.0">
9797
<columns>
9898
<TableColumn prefWidth="0" text="" />
9999
</columns>
@@ -107,7 +107,7 @@
107107
<content>
108108
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
109109
<children>
110-
<TableView fx:id="inventoryTableView" layoutX="14.0" layoutY="12.0" prefHeight="415.0" prefWidth="571.0">
110+
<TableView fx:id="inventoryTableView" layoutX="14.0" layoutY="12.0" prefHeight="400.0" prefWidth="571.0">
111111
<columns>
112112
<TableColumn prefWidth="0" text="" />
113113
</columns>
@@ -130,6 +130,24 @@
130130
</AnchorPane>
131131
</content>
132132
</Tab>
133+
<Tab text="Sales Frequently Together Report">
134+
<content>
135+
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="157.0" prefWidth="441.0">
136+
<children>
137+
<DatePicker fx:id="startDatePicker" layoutX="50.0" layoutY="11.0" />
138+
<DatePicker fx:id="endDatePicker" layoutX="291.0" layoutY="12.0" />
139+
<Label layoutX="14.0" layoutY="16.0" text="Start:" />
140+
<Label layoutX="254.0" layoutY="17.0" text="End:" />
141+
<TableView fx:id="salesFrequentReportTableView" layoutX="14.0" layoutY="47.0" prefHeight="380.0" prefWidth="551.0">
142+
<columns>
143+
<TableColumn prefWidth="0" text="" />
144+
</columns>
145+
</TableView>
146+
<Button layoutX="495.0" layoutY="12.0" mnemonicParsing="false" onAction="#generateFrequentSalesReport" text="Get Sales" />
147+
</children>
148+
</AnchorPane>
149+
</content>
150+
</Tab>
133151
<Tab text="Menu">
134152
<content>
135153
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">

0 commit comments

Comments
 (0)