Skip to content
Snippets Groups Projects
Commit 11c5130c authored by Robert Goldmann's avatar Robert Goldmann
Browse files

added update repeating payment entries in database to server

parent 6930762d
Branches
Tags
1 merge request!58merge new_database_structure into master
package de.deadlocker8.budgetmaster.logic;
public class LatestRepeatingPayment
{
private int ID;
private int repeatingPaymentID;
private String lastDate;
public LatestRepeatingPayment(int ID, int repeatingPaymentID, String lastDate)
{
this.ID = ID;
this.repeatingPaymentID = repeatingPaymentID;
this.lastDate = lastDate;
}
public int getID()
{
return ID;
}
public int getRepeatingPaymentID()
{
return repeatingPaymentID;
}
public String getLastDate()
{
return lastDate;
}
@Override
public String toString()
{
return "LatestRepeatingPayment [ID=" + ID + ", repeatingPaymentID=" + repeatingPaymentID + ", lastDate=" + lastDate + "]";
}
}
\ No newline at end of file
......@@ -49,4 +49,18 @@ public class RepeatingPayment extends Payment
{
return "RepeatingPayment [ID=" + super.getID() + ", amount=" + super.getAmount() + ", date=" + super.getDate() + ", categoryID=" + super.getCategoryID() + ", name=" + super.getName() + ", repeatInterval=" + repeatInterval + ", repeatEndDate=" + repeatEndDate + ", repeatMonthDay=" + repeatMonthDay + "]";
}
@Override
public boolean equals(Object obj)
{
if(obj instanceof LatestRepeatingPayment)
{
return super.getID() == ((LatestRepeatingPayment)obj).getRepeatingPaymentID();
}
else if(obj instanceof RepeatingPayment)
{
return super.getID() == ((RepeatingPayment)obj).getID();
}
return super.equals(obj);
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ 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.RepeatingPayment;
import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
......@@ -372,7 +373,7 @@ public class DatabaseHandler
public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
{
Statement stmt = null;
String query = "SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay FROM repeating_entry, repeating_payment WHERE repeating_payment.ID = (SELECT RepeatingPaymentID FROM repeating_entry WHERE YEAR(Date) = " + year + " AND MONTH(Date) = " + month + ")";
String query = "SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = " + year + " AND MONTH(repeating_entry.Date) = " + month;
ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
try
......@@ -462,6 +463,47 @@ public class DatabaseHandler
return results;
}
public ArrayList<LatestRepeatingPayment> getLatestRepeatingPaymentEntries()
{
Statement stmt = null;
String query = "SELECT ID, RepeatingPaymentID, MAX(Date) as 'LastDate' FROM repeating_entry GROUP BY RepeatingPaymentID";
ArrayList<LatestRepeatingPayment> results = new ArrayList<>();
try
{
stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while(rs.next())
{
int resultID = rs.getInt("ID");
int repeatingPaymentID = rs.getInt("repeatingPaymentID");
String date = rs.getString("LastDate");
results.add(new LatestRepeatingPayment(resultID, repeatingPaymentID, date));
}
}
catch(SQLException e)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
}
finally
{
if(stmt != null)
{
try
{
stmt.close();
}
catch(SQLException e)
{
}
}
}
return results;
}
/*
* DELETE
*/
......@@ -620,6 +662,35 @@ public class DatabaseHandler
}
}
public void addRepeatingPaymentEntry(int repeatingPaymentID, String date)
{
Statement stmt = null;
String query;
query = "INSERT INTO repeating_entry (RepeatingPaymentID, Date) VALUES('" + repeatingPaymentID + "' , '" + date + "');";
try
{
stmt = connection.createStatement();
stmt.execute(query);
}
catch(SQLException e)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
}
finally
{
if(stmt != null)
{
try
{
stmt.close();
}
catch(SQLException e)
{
}
}
}
}
/*
* UPDATE
*/
......
package de.deadlocker8.budgetmasterserver.server;
import static spark.Spark.*;
import static spark.Spark.before;
import static spark.Spark.delete;
import static spark.Spark.get;
import static spark.Spark.halt;
import static spark.Spark.port;
import static spark.Spark.post;
import static spark.Spark.put;
import static spark.Spark.secure;
import java.io.IOException;
import java.net.URISyntaxException;
......@@ -8,20 +15,31 @@ import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Months;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import de.deadlocker8.budgetmaster.logic.*;
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.RepeatingPayment;
import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
import de.deadlocker8.budgetmasterserver.main.DatabaseHandler;
import de.deadlocker8.budgetmasterserver.main.Settings;
import de.deadlocker8.budgetmasterserver.main.Utils;
import javafx.scene.paint.Color;
import logger.LogLevel;
import logger.Logger;
import spark.Spark;
import spark.route.RouteOverview;
public class SparkServer
{
private static Settings settings;
private static Gson gson;
public static void main(String[] args) throws URISyntaxException
......@@ -44,7 +62,7 @@ public class SparkServer
}
}
Settings settings = Utils.loadSettings();
settings = Utils.loadSettings();
port(settings.getServerPort());
//DEBUG
......@@ -59,6 +77,8 @@ public class SparkServer
{
halt(401, "Unauthorized");
}
updateRepeatingPayments();
});
/*
......@@ -303,7 +323,6 @@ public class SparkServer
});
get("/repeatingpayment", (req, res) -> {
if(!req.queryParams().contains("year") || !req.queryParams().contains("month"))
{
halt(400, "Bad Request");
......@@ -453,5 +472,81 @@ public class SparkServer
return "";
});
Spark.exception(Exception.class, (exception, request, response)->{
exception.printStackTrace();
});
}
private static void updateRepeatingPayments()
{
try
{
DatabaseHandler handler = new DatabaseHandler(settings);
ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRunningRepeatingPayments();
ArrayList<LatestRepeatingPayment> latest = handler.getLatestRepeatingPaymentEntries();;
for(RepeatingPayment currentPayment : repeatingPayments)
{
int index = latest.indexOf(currentPayment);
DateTime now = DateTime.now();
ArrayList<DateTime> correctDates = getCorrectRepeatingDates(currentPayment, now);
if(index != -1)
{
LatestRepeatingPayment currentLatest = latest.get(index);
DateTime latestDate = DateTime.parse(currentLatest.getLastDate());
for(int i = correctDates.size()-1; i > 0; i--)
{
DateTime currentDate = correctDates.get(i);
if(currentDate.isBefore(latestDate) || currentDate.isEqual(latestDate))
{
break;
}
handler.addRepeatingPaymentEntry(currentLatest.getRepeatingPaymentID(), currentDate.toString("yyyy-MM-dd"));
}
}
else
{
for(DateTime currentDate : correctDates)
{
handler.addRepeatingPaymentEntry(currentPayment.getID(), currentDate.toString("yyyy-MM-dd"));
}
}
}
}
catch(IllegalStateException ex)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(ex));
}
}
private static ArrayList<DateTime> getCorrectRepeatingDates(RepeatingPayment payment, DateTime now)
{
ArrayList<DateTime> dates = new ArrayList<>();
DateTime startDate = DateTime.parse(payment.getDate());
//repeat every x days
if(payment.getRepeatInterval() != 0)
{
int numberOfDays = Days.daysBetween(startDate, now).getDays();
int occurrences = numberOfDays % payment.getRepeatInterval();
for(int i = 0; i <= occurrences + 1; i++)
{
dates.add(startDate.plusDays(i * payment.getRepeatInterval()));
}
}
//repeat every month on day x
else
{
int numberOfMonths = Months.monthsBetween(startDate.withDayOfMonth(payment.getRepeatMonthDay()), now).getMonths();
for(int i = 0; i <= numberOfMonths; i++)
{
dates.add(startDate.plusMonths(i));
}
}
return dates;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment