From 8390811c398f3b72684be7e5c8573006c31cd9d1 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 12 Mar 2017 11:47:26 +0100 Subject: [PATCH] Fixed #45 - add option to enable/disable rest --- .../budgetmaster/logic/ServerConnection.java | 21 ++++ .../budgetmaster/ui/Controller.java | 14 ++- .../budgetmaster/ui/SettingsController.java | 1 + .../main/DatabaseHandler.java | 96 ++++++++++++------- .../server/SparkServer.java | 4 + .../server/rest/RestGet.java | 62 ++++++++++++ 6 files changed, 160 insertions(+), 38 deletions(-) create mode 100644 src/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java index 4f4293c29..0ce98e44d 100644 --- a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java +++ b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java @@ -282,4 +282,25 @@ public class ServerConnection BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); reader.close(); } + + /* + * REST + */ + public int getRestForAllPreviousMonths(int year, int month) throws Exception + { + URL url = new URL(settings.getUrl() + "/rest?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&year=" + year + "&month=" + month); + HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection(); + httpsCon.setDoOutput(true); + httpsCon.setRequestMethod("GET"); + + if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK) + { + String result = Read.getStringFromInputStream(httpsCon.getInputStream()); + return gson.fromJson(result, Integer.class); + } + else + { + return 0; + } + } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java index b25704611..9cfea20fe 100644 --- a/src/de/deadlocker8/budgetmaster/ui/Controller.java +++ b/src/de/deadlocker8/budgetmaster/ui/Controller.java @@ -11,6 +11,7 @@ import org.joda.time.DateTime; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.CategoryHandler; +import de.deadlocker8.budgetmaster.logic.NormalPayment; import de.deadlocker8.budgetmaster.logic.Payment; import de.deadlocker8.budgetmaster.logic.ServerConnection; import de.deadlocker8.budgetmaster.logic.Settings; @@ -260,9 +261,9 @@ public class Controller implements Refreshable try { ServerConnection connection = new ServerConnection(settings); - categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); + categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); + payments = new ArrayList<>(); - //TODO add rest if enabled by user payments.addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear())); payments.addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear())); Collections.sort(payments, new Comparator<Payment>() { @@ -271,7 +272,14 @@ public class Controller implements Refreshable { return payment2.getDate().compareTo(payment1.getDate()); } - }); + }); + if(settings.isRestActivated()) + { + int rest = connection.getRestForAllPreviousMonths(currentDate.getYear(), currentDate.getMonthOfYear()); + //categoryID 2 = Rest + payments.add(new NormalPayment(-1, rest, currentDate.withDayOfMonth(1).toString("yyyy-MM-dd"), 2, "Übertrag")); + } + categoryHandler = new CategoryHandler(connection.getCategories()); } catch(Exception e) diff --git a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java index fd684c653..92ec0e3fc 100644 --- a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java +++ b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java @@ -76,6 +76,7 @@ public class SettingsController controller.setSettings(settings); } Utils.saveSettings(controller.getSettings()); + controller.refresh(); controller.showNotification("Erfolgreich gespeichert"); } else diff --git a/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java b/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java index c9915e262..25018a33b 100644 --- a/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java +++ b/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java @@ -15,6 +15,7 @@ import de.deadlocker8.budgetmaster.logic.Category; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.LatestRepeatingPayment; import de.deadlocker8.budgetmaster.logic.NormalPayment; +import de.deadlocker8.budgetmaster.logic.Payment; import de.deadlocker8.budgetmaster.logic.RepeatingPayment; import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry; import javafx.scene.paint.Color; @@ -42,9 +43,7 @@ public class DatabaseHandler /* * GET */ - - @Deprecated - public DateTime getFirstPaymentDate() + public DateTime getFirstNormalPaymentDate() { Statement stmt = null; String query = "SELECT MIN(Date) as \"min\" FROM Payment"; @@ -79,38 +78,12 @@ public class DatabaseHandler return dateTime; } - - @Deprecated - public int getRestForAllPreviousMonths(int year, int month) - { - DateTime firstDate = getFirstPaymentDate(); - - int startYear = firstDate.getYear(); - int startMonth = firstDate.getMonthOfYear(); - int totalRest = 0; - - while(startYear < year || startMonth < month) - { - totalRest += getRest(startYear, startMonth); - - startMonth++; - if(startMonth > 12) - { - startMonth = 1; - startYear++; - } - } - return totalRest; - } - - @Deprecated - public int getRest(int year, int month) + + public DateTime getFirstRepeatingPaymentDate() { Statement stmt = null; - String query = "SELECT SUM(q.amount) as \"rest\" FROM(SELECT Payment.amount as \"amount\" FROM Payment WHERE (YEAR(Date) = " + year + " AND MONTH(Date) = " + month - + " OR RepeatMonthDay != 0 OR RepeatInterval != 0 AND DATEDIFF(NOW(), Date ) % RepeatInterval = 0 AND RepeatEndDate IS NULL OR RepeatInterval != 0 AND DATEDIFF(NOW(), Date ) % RepeatInterval = 0 AND RepeatEndDate IS NOT NULL AND DATEDIFF(RepeatEndDate, NOW()) > 0) GROUP BY Payment.ID ORDER BY Payment.Date) q"; - - int result = 0; + String query = "SELECT MIN(Date) as \"min\" FROM repeating_payment"; + DateTime dateTime = null; try { stmt = connection.createStatement(); @@ -118,7 +91,7 @@ public class DatabaseHandler while(rs.next()) { - result = rs.getInt("rest"); + dateTime = formatter.parseDateTime(rs.getString("min")); } } catch(SQLException e) @@ -139,7 +112,60 @@ public class DatabaseHandler } } - return result; + return dateTime; + } + + public int getRestForAllPreviousMonths(int year, int month) + { + DateTime firstNormalPaymentDate = getFirstNormalPaymentDate(); + DateTime firstRepeatingPaymentDate = getFirstRepeatingPaymentDate(); + + DateTime firstDate = firstNormalPaymentDate; + if(firstRepeatingPaymentDate.isBefore(firstNormalPaymentDate)) + { + firstDate = firstRepeatingPaymentDate; + } + + DateTimeFormatter formatter = DateTimeFormat.forPattern("MM.yyyy"); + String dateString = String.valueOf(month) + "." + year; + DateTime currentDate = formatter.parseDateTime(dateString);// + + if(firstDate.isAfter(currentDate)) + { + return 0; + } + + int startYear = firstDate.getYear(); + int startMonth = firstDate.getMonthOfYear(); + int totalRest = 0; + + while(startYear < year || startMonth < month) + { + totalRest += getRest(startYear, startMonth); + + startMonth++; + if(startMonth > 12) + { + startMonth = 1; + startYear++; + } + } + return totalRest; + } + + public int getRest(int year, int month) + { + ArrayList<Payment> payments = new ArrayList<>(); + payments.addAll(getPayments(year, month)); + payments.addAll(getRepeatingPayments(year, month)); + + int rest = 0; + for(Payment currentPayment : payments) + { + rest += currentPayment.getAmount(); + } + + return rest; } public ArrayList<Category> getCategories() diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java index 349ae5031..c97cd2c5e 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java +++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java @@ -27,6 +27,7 @@ import de.deadlocker8.budgetmasterserver.server.payment.repeating.RepeatingPayme import de.deadlocker8.budgetmasterserver.server.payment.repeating.RepeatingPaymentDelete; import de.deadlocker8.budgetmasterserver.server.payment.repeating.RepeatingPaymentGet; import de.deadlocker8.budgetmasterserver.server.payment.repeating.RepeatingPaymentGetAll; +import de.deadlocker8.budgetmasterserver.server.rest.RestGet; import de.deadlocker8.budgetmasterserver.server.updater.RepeatingPaymentUpdater; import logger.LogLevel; import logger.Logger; @@ -102,6 +103,9 @@ public class SparkServer get("/repeatingpayment", new RepeatingPaymentGetAll(handler, gson)); post("/repeatingpayment", new RepeatingPaymentAdd(handler)); delete("/repeatingpayment", new RepeatingPaymentDelete(handler)); + + // Rest + get("/rest", new RestGet(handler, gson)); after((request, response) -> { new RepeatingPaymentUpdater(handler).updateRepeatingPayments(); diff --git a/src/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java b/src/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java new file mode 100644 index 000000000..0962749b5 --- /dev/null +++ b/src/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java @@ -0,0 +1,62 @@ +package de.deadlocker8.budgetmasterserver.server.rest; + +import static spark.Spark.halt; + +import com.google.gson.Gson; + +import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; +import spark.Request; +import spark.Response; +import spark.Route; + +public class RestGet implements Route +{ + private DatabaseHandler handler; + private Gson gson; + + public RestGet(DatabaseHandler handler, Gson gson) + { + this.handler = handler; + this.gson = gson; + } + + @Override + public Object handle(Request req, Response res) throws Exception + { + if(!req.queryParams().contains("year") || !req.queryParams().contains("month")) + { + halt(400, "Bad Request"); + } + + int year = 0; + int month = 0; + + try + { + year = Integer.parseInt(req.queryMap("year").value()); + month = Integer.parseInt(req.queryMap("month").value()); + + if(year < 0 || month < 1 || month > 12) + { + halt(400, "Bad Request"); + } + + try + { + int rest = handler.getRestForAllPreviousMonths(year, month); + + return gson.toJson(rest); + } + catch(IllegalStateException ex) + { + halt(500, "Internal Server Error"); + } + } + catch(Exception e) + { + halt(400, "Bad Request"); + } + + return null; + } +} \ No newline at end of file -- GitLab