package budgetforce.control;
import budgetforce.model.DatabaseManager;
import static budgetforce.model.EPeriod.DAY;
import static budgetforce.model.EPeriod.MONTH;
import static budgetforce.model.EPeriod.ONCE;
import static budgetforce.model.EPeriod.QUARTER;
import static budgetforce.model.EPeriod.WEEK;
import static budgetforce.model.EPeriod.YEAR;
import java.sql.Timestamp;
import java.util.ArrayList;
/**
*
* @author Soi Fon
*/
public class Outgoing
{
public Outgoing(int personID)
{
modelOutgoing = new ArrayList<budgetforce.model.Outgoing>();
//this s**t wouldn´t happening if we had a personID in Outgoing =D
ArrayList<budgetforce.model.Budget> budgets = DatabaseManager.getDatabaseManager().getBudgetByPersonID(personID);
for (budgetforce.model.Budget budget : budgets)
{
ArrayList<budgetforce.model.Outgoing> temp = DatabaseManager.getDatabaseManager().getOutgoingByBudgetID(budget.getId());
if(!temp.isEmpty())
{
modelOutgoing.addAll(temp);
}
}
}
public float MonthOutgoing(int year, int month)
{
float completteOutgoings = 0.0f;
for (budgetforce.model.Outgoing outgoing : modelOutgoing)
{
Timestamp start = outgoing.getStart();
Timestamp end = outgoing.getEnd();
System.err.println("ID: " + outgoing.getId() + " Amount: " + outgoing.getAmount() + " BudgetID: " + outgoing.getBudgetId() + " PeriodID: " + outgoing.getPeriod());
//period starts before and ends after this month
if(DateHandle.Compare(start, year, month) == -1 &&
DateHandle.Compare(end, year, month) == 1)
{
switch(outgoing.getPeriod())
{
case DAY : completteOutgoings += outgoing.getAmount() * DateHandle.GetDaysOfMonth(year, month); break;
case WEEK : completteOutgoings += outgoing.getAmount() * (DateHandle.GetDaysOfMonth(year, month) / 7);break;
case MONTH : completteOutgoings += outgoing.getAmount(); break;
case QUARTER: completteOutgoings += outgoing.getAmount() / 3; break;
case YEAR : completteOutgoings += outgoing.getAmount() / 12;break;
}
continue;
}
//Period ends this month
if(DateHandle.Compare(start, year, month) == -1 &&
DateHandle.Compare(end, year, month) == 0)
{
float days = end.getDate() + 1;
switch(outgoing.getPeriod())
{
case DAY : completteOutgoings += outgoing.getAmount() * days; break;
case WEEK : completteOutgoings += outgoing.getAmount() * (days / 7);break;
case MONTH : completteOutgoings += outgoing.getAmount() * (days / DateHandle.GetDaysOfMonth(year, month));break;
case QUARTER: completteOutgoings += (outgoing.getAmount() / 3) * (days / DateHandle.GetDaysOfMonth(year, month));break;
case YEAR : completteOutgoings += (outgoing.getAmount() / 12) * (days / DateHandle.GetDaysOfMonth(year, month));break;
}
continue;
}
//Period starts this month
if(DateHandle.Compare(start, year, month) == 0 &&
DateHandle.Compare(end, year, month) == 1)
{
float daysLeft = (DateHandle.GetDaysOfMonth(year, month) - start.getDate()) + 1;
switch(outgoing.getPeriod())
{
case DAY : completteOutgoings += outgoing.getAmount() * daysLeft; break;
case WEEK : completteOutgoings += outgoing.getAmount() * (daysLeft / 7);break;
case MONTH : completteOutgoings += outgoing.getAmount() * (daysLeft / DateHandle.GetDaysOfMonth(year, month));break;
case QUARTER: completteOutgoings += (outgoing.getAmount() / 3) * (daysLeft / DateHandle.GetDaysOfMonth(year, month));break;
case YEAR : completteOutgoings += (outgoing.getAmount() / 12) * (daysLeft / DateHandle.GetDaysOfMonth(year, month));break;
}
continue;
}
//Period starts and ends this month
if(DateHandle.Compare(start, year, month) == 0 &&
DateHandle.Compare(end, year, month) == 0)
{
float days = end.getDate() - start.getDate() + 1;
switch(outgoing.getPeriod())
{
case ONCE : completteOutgoings += outgoing.getAmount(); break;
case DAY : completteOutgoings += outgoing.getAmount() * days; break;
case WEEK : completteOutgoings += outgoing.getAmount() * (days / 7);break;
case MONTH : completteOutgoings += outgoing.getAmount();break; //there should not be a month , quarter or year period with
case QUARTER: completteOutgoings += outgoing.getAmount();break; //a start and end date within a month anyway, so just the full amount will be
case YEAR : completteOutgoings += outgoing.getAmount();break; //added in this case
}
continue;
}
}
return completteOutgoings;
}
private ArrayList<budgetforce.model.Outgoing> modelOutgoing;
}