From 5e4ec00f6d838efcac64698a462f7771d1d7e225 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 12 Mar 2017 12:43:25 +0100
Subject: [PATCH] implemented CategoryBudgets

---
 .../budgetmaster/logic/Helpers.java           | 46 +++++++++++++
 .../budgetmaster/logic/ServerConnection.java  | 28 +-------
 .../deadlocker8/budgetmaster/main/Main.java   |  2 +-
 .../budgetmaster/ui/Controller.java           |  8 ++-
 .../deadlocker8/budgetmaster/ui/HomeTab.fxml  | 10 ++-
 .../main/DatabaseHandler.java                 | 49 +-------------
 .../server/SparkServer.java                   |  4 --
 .../categorybudget/CategoryBudgetGet.java     | 65 -------------------
 8 files changed, 63 insertions(+), 149 deletions(-)
 delete mode 100644 src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java

diff --git a/src/de/deadlocker8/budgetmaster/logic/Helpers.java b/src/de/deadlocker8/budgetmaster/logic/Helpers.java
index a3761e796..2f72888eb 100644
--- a/src/de/deadlocker8/budgetmaster/logic/Helpers.java
+++ b/src/de/deadlocker8/budgetmaster/logic/Helpers.java
@@ -5,6 +5,10 @@ import java.net.URLEncoder;
 import java.text.DecimalFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
 
 public class Helpers
 {
@@ -31,4 +35,46 @@ public class Helpers
 		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 		return date.format(formatter);
 	}
+	
+	public static ArrayList<CategoryBudget> getCategoryBudgets(CategoryHandler categoryHandler, ArrayList<Payment> payments)
+	{
+		ArrayList<CategoryBudget> budgets = new ArrayList<>();
+		
+		for(Category currentCategory : categoryHandler.getCategories())
+		{
+			budgets.add(new CategoryBudget(currentCategory.getName(), currentCategory.getColor(), 0));
+			CategoryBudget currentBudget = budgets.get(budgets.size() - 1);
+			for(Payment currentPayment : payments)
+			{
+				//filter rest
+				if(currentCategory.getID() != 2)
+				{
+					if(currentCategory.getID() == currentPayment.getCategoryID())
+					{
+						currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount());
+					}
+				}
+			}
+		}
+		
+		//filter empty categories
+		Iterator<CategoryBudget> iterator = budgets.iterator();
+		while(iterator.hasNext())
+		{		
+			if(iterator.next().getBudget() == 0)
+			{
+				iterator.remove();
+			}
+		}
+		
+		Collections.sort(budgets, new Comparator<CategoryBudget>() {
+	        @Override
+	        public int compare(CategoryBudget budget1, CategoryBudget budget2)
+	        {
+	            return  Double.compare(budget1.getBudget(), budget2.getBudget());
+	        }
+	    });		
+		
+		return budgets;		
+	}
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
index 0ce98e44d..f7e9f6e43 100644
--- a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
+++ b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
@@ -128,33 +128,7 @@ public class ServerConnection
 		BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
 		reader.close();
 	}
-
-	/*
-	 * CategoryBudget
-	 */
-	@Deprecated
-	public ArrayList<CategoryBudget> getCategoryBudgets(int year, int month) throws Exception
-	{
-		URL url = new URL(settings.getUrl() + "/categorybudget?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());
-			// required by GSON
-			Type listType = new TypeToken<ArrayList<CategoryBudget>>()
-			{
-			}.getType();
-			return gson.fromJson(result, listType);
-		}
-		else
-		{
-			return null;
-		}
-	}
-
+	
 	/*
 	 * Payment
 	 */
diff --git a/src/de/deadlocker8/budgetmaster/main/Main.java b/src/de/deadlocker8/budgetmaster/main/Main.java
index 7ebbcc8cb..de459fc72 100644
--- a/src/de/deadlocker8/budgetmaster/main/Main.java
+++ b/src/de/deadlocker8/budgetmaster/main/Main.java
@@ -28,7 +28,7 @@ public class Main extends Application
 			FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/deadlocker8/budgetmaster/ui/GUI.fxml"));
 			Parent root = (Parent)loader.load();
 
-			Scene scene = new Scene(root, 600, 600);			
+			Scene scene = new Scene(root, 600, 650);			
 
 			((Controller)loader.getController()).init(stage);
 
diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java
index 9cfea20fe..8d7c3ed43 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.Helpers;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.Payment;
 import de.deadlocker8.budgetmaster.logic.ServerConnection;
@@ -260,8 +261,7 @@ public class Controller implements Refreshable
 	{
 		try
 		{
-			ServerConnection connection = new ServerConnection(settings);
-			categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear());		
+			ServerConnection connection = new ServerConnection(settings);			
 			
 			payments = new ArrayList<>();
 			payments.addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear()));
@@ -278,9 +278,11 @@ public class Controller implements Refreshable
 				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());
+			
+			categoryBudgets = Helpers.getCategoryBudgets(categoryHandler, payments);		
 		}
 		catch(Exception e)
 		{
diff --git a/src/de/deadlocker8/budgetmaster/ui/HomeTab.fxml b/src/de/deadlocker8/budgetmaster/ui/HomeTab.fxml
index a94b2d9e2..2af758091 100644
--- a/src/de/deadlocker8/budgetmaster/ui/HomeTab.fxml
+++ b/src/de/deadlocker8/budgetmaster/ui/HomeTab.fxml
@@ -23,10 +23,18 @@
                </font>
             </Label>
             <ProgressBar fx:id="progressBar" prefHeight="18.0" prefWidth="380.0" progress="0.68" />
-            <ListView fx:id="listView" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
+            <Label text="Verbrauch nach Kategorien">
+               <font>
+                  <Font name="System Bold" size="16.0" />
+               </font>
                <VBox.margin>
                   <Insets top="25.0" />
                </VBox.margin>
+            </Label>
+            <ListView fx:id="listView" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
+               <VBox.margin>
+                  <Insets />
+               </VBox.margin>
             </ListView>
          </children>
       </VBox>
diff --git a/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java b/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java
index 25018a33b..1edd1a699 100644
--- a/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java
+++ b/src/de/deadlocker8/budgetmasterserver/main/DatabaseHandler.java
@@ -12,7 +12,6 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 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;
@@ -245,55 +244,9 @@ public class DatabaseHandler
 
 		return result;
 	}
-
-	@Deprecated
-	public ArrayList<CategoryBudget> getCategoryBudget(int year, int month)
-	{
-//		String date = String.valueOf(year) + "-" + String.format("%02d", month) + "-";
-//		Statement stmt = null;
-//		String query = "SELECT q.cat_name AS \"Name\", q.cat_col AS \"Color\", SUM(q.amoun) AS \"Amount\" FROM (SELECT Payment.CategoryID as \"cat_ID\", Category.Name as \"cat_name\", Category.Color as \"cat_col\", Payment.Amount AS \"amoun\" FROM Payment, Category WHERE Payment.CategoryID = Category.ID AND (YEAR(Date) = "
-//				+ year + " AND  MONTH(Date) = " + month + " AND RepeatMonthDay = 0 OR RepeatMonthDay != 0 AND CONCAT('" + date + "', RepeatMonthDay) >= Date AND RepeatEndDate IS NULL OR RepeatMonthDay != 0 AND CONCAT('" + date + "', RepeatMonthDay) >= Date AND CONCAT('" + date
-//				+ "', RepeatMonthDay) <= RepeatEndDate 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) as q GROUP BY q.cat_ID ORDER BY SUM(q.amoun) DESC";
-//		ArrayList<CategoryBudget> results = new ArrayList<>();
-//		try
-//		{
-//			stmt = connection.createStatement();
-//			ResultSet rs = stmt.executeQuery(query);
-//
-//			while(rs.next())
-//			{
-//				String name = rs.getString("Name");
-//				String color = rs.getString("Color");
-//				int amount = rs.getInt("Amount");
-//
-//				results.add(new CategoryBudget(name, Color.web(color), amount));
-//			}
-//		}
-//		catch(SQLException e)
-//		{
-//			Logger.error(e);
-//		}
-//		finally
-//		{
-//			if(stmt != null)
-//			{
-//				try
-//				{
-//					stmt.close();
-//				}
-//				catch(SQLException e)
-//				{
-//				}
-//			}
-//		}
-//
-//		return results;
-		return null;
-	}
-
+	
 	public NormalPayment getPayment(int ID)
 	{
-		//TODO query
 		Statement stmt = null;
 		String query = "SELECT * FROM Payment WHERE Payment.ID= " + ID;
 		try
diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index 83c6b649f..735dcbdd4 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -27,7 +27,6 @@ import de.deadlocker8.budgetmasterserver.server.category.CategoryDelete;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryGet;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryGetAll;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryUpdate;
-import de.deadlocker8.budgetmasterserver.server.categorybudget.CategoryBudgetGet;
 import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentAdd;
 import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentDelete;
 import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentGet;
@@ -100,9 +99,6 @@ public class SparkServer
 		put("/category", new CategoryUpdate(handler));
 		delete("/category", new CategoryDelete(handler));
 
-		// CategoryBudget
-		get("/categorybudget", new CategoryBudgetGet(handler, gson));
-
 		// Payment
 		// Normal
 		get("/payment", new PaymentGet(handler, gson));
diff --git a/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
deleted file mode 100644
index c6e752a9a..000000000
--- a/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package de.deadlocker8.budgetmasterserver.server.categorybudget;
-
-import static spark.Spark.halt;
-
-import java.util.ArrayList;
-
-import com.google.gson.Gson;
-
-import de.deadlocker8.budgetmaster.logic.CategoryBudget;
-import de.deadlocker8.budgetmasterserver.main.DatabaseHandler;
-import spark.Request;
-import spark.Response;
-import spark.Route;
-
-public class CategoryBudgetGet implements Route
-{
-	private DatabaseHandler handler;
-	private Gson gson;
-
-	public CategoryBudgetGet(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
-			{					
-				ArrayList<CategoryBudget> categories = handler.getCategoryBudget(year, month);			
-
-				return gson.toJson(categories);
-			}
-			catch(IllegalStateException ex)
-			{
-				halt(500, "Internal Server Error");
-			}
-		}
-		catch(Exception e)
-		{
-			halt(400, "Bad Request");
-		}
-		
-		return null;
-	}
-}
\ No newline at end of file
-- 
GitLab