diff --git a/app/controllers/RepeatedExpenseController.php b/app/controllers/RepeatedExpenseController.php index 58e7242997..a72da7bba0 100644 --- a/app/controllers/RepeatedExpenseController.php +++ b/app/controllers/RepeatedExpenseController.php @@ -51,7 +51,17 @@ class RepeatedExpenseController extends BaseController $subTitle = $piggyBank->name; $today = Carbon::now(); - return View::make('repeatedexpense.show', compact('piggyBank', 'today', 'subTitle')); + /** @var \FireflyIII\Database\RepeatedExpense $repository */ + $repository = App::make('FireflyIII\Database\RepeatedExpense'); + + $repetitions = $piggyBank->piggybankrepetitions()->get(); + $repetitions->each( + function (PiggybankRepetition $repetition) use ($repository) { + $repetition = $repository->calculateParts($repetition); + } + ); + + return View::make('repeatedexpense.show', compact('repetitions','piggyBank', 'today', 'subTitle')); } /** diff --git a/app/lib/FireflyIII/Collection/PiggybankPart.php b/app/lib/FireflyIII/Collection/PiggybankPart.php index 3b198df5db..bf5fb94d86 100644 --- a/app/lib/FireflyIII/Collection/PiggybankPart.php +++ b/app/lib/FireflyIII/Collection/PiggybankPart.php @@ -12,6 +12,8 @@ class PiggybankPart public $amountPerBar; /** @var int */ public $currentamount; + /** @var \Reminder */ + public $reminder; /** @var \PiggybankRepetition */ public $repetition; /** @var Carbon */ @@ -19,6 +21,22 @@ class PiggybankPart /** @var Carbon */ public $targetdate; + /** + * @return \Reminder + */ + public function getReminder() + { + return $this->reminder; + } + + /** + * @param \Reminder $reminder + */ + public function setReminder($reminder) + { + $this->reminder = $reminder; + } + /** * @return \PiggybankRepetition */ @@ -67,6 +85,11 @@ class PiggybankPart $this->targetdate = $targetdate; } + public function hasReminder() + { + return !is_null($this->reminder); + } + public function percentage() { if ($this->getCurrentamount() < $this->getAmount()) { @@ -130,6 +153,4 @@ class PiggybankPart { $this->amountPerBar = $amountPerBar; } - - } \ No newline at end of file diff --git a/app/lib/FireflyIII/Database/RepeatedExpense.php b/app/lib/FireflyIII/Database/RepeatedExpense.php index 2295c70012..9eda8edb9a 100644 --- a/app/lib/FireflyIII/Database/RepeatedExpense.php +++ b/app/lib/FireflyIII/Database/RepeatedExpense.php @@ -116,6 +116,26 @@ class RepeatedExpense implements CUD, CommonDatabaseCalls, PiggybankInterface // } for ($i = 0; $i < $parts; $i++) { + /* + * If it's not the first repetition, jump the start date a [period] + * and jump the target date a [period] + */ + if($i > 0) { + $currentStart = clone $currentTarget; + $currentStart->addDay(); + $currentTarget = \DateKit::addPeriod($currentStart, $piggyBank->reminder,0); + } + /* + * If it's the first one, and has reminders, jump to the end of the [period] + */ + if($i == 0 && !is_null($piggyBank->reminder)) { + $currentTarget = \DateKit::endOfX($currentStart, $piggyBank->reminder); + } + if($currentStart > $repetition->targetdate) { + break; + } + + /* * Jump one month ahead after the first instance: */ @@ -148,6 +168,17 @@ class RepeatedExpense implements CUD, CommonDatabaseCalls, PiggybankInterface $part->setCurrentamount($repetition->currentamount); $part->setStartdate($currentStart); $part->setTargetdate($currentTarget); + if (!is_null($piggyBank->reminder)) { + // might be a reminder for this range? + $reminder = $piggyBank->reminders() + ->where('startdate',$currentStart->format('Y-m-d')) + ->where('enddate',$currentTarget->format('Y-m-d')) + ->first(); + if($reminder) { + $part->setReminder($reminder); + } + + } // if (!is_null($piggyBank->reminder)) { // $currentStart = \DateKit::addPeriod($currentStart, $piggyBank->reminder, 0); diff --git a/app/lib/FireflyIII/Shared/Toolkit/Date.php b/app/lib/FireflyIII/Shared/Toolkit/Date.php index 5725db90ad..90152551ae 100644 --- a/app/lib/FireflyIII/Shared/Toolkit/Date.php +++ b/app/lib/FireflyIII/Shared/Toolkit/Date.php @@ -98,6 +98,51 @@ class Date return $currentEnd; } + /** + * @param Carbon $theCurrentEnd + * @param $repeatFreq + * + * @return mixed + * @throws FireflyException + */ + public function endOfX(Carbon $theCurrentEnd, $repeatFreq) + { + $currentEnd = clone $theCurrentEnd; + switch ($repeatFreq) { + default: + throw new FireflyException('Cannot do endOfPeriod for $repeat_freq ' . $repeatFreq); + break; + case 'daily': + $currentEnd->endOfDay(); + break; + case 'week': + case 'weekly': + $currentEnd->endOfWeek(); + break; + case 'month': + case 'monthly': + $currentEnd->endOfMonth(); + break; + case 'quarter': + case 'quarterly': + $currentEnd->lastOfQuarter(); + break; + case 'half-year': + $month = intval($theCurrentEnd->format('m')); + $currentEnd->endOfYear(); + if($month <= 6) { + $currentEnd->subMonths(6); + } + break; + case 'year': + case 'yearly': + $currentEnd->endOfYear(); + break; + } + + return $currentEnd; + } + public function periodShow(Carbon $date, $repeatFrequency) { switch ($repeatFrequency) { @@ -107,13 +152,18 @@ class Date case 'daily': return $date->format('j F Y'); break; + case 'week': case 'weekly': return $date->format('\W\e\e\k W, Y'); break; + case 'quarter': + return $date->format('F Y'); + break; case 'monthly': case 'month': return $date->format('F Y'); break; + case 'year': case 'yearly': return $date->format('Y'); break; diff --git a/app/lib/FireflyIII/Shared/Toolkit/Reminders.php b/app/lib/FireflyIII/Shared/Toolkit/Reminders.php index 040c9cccd6..10197cf05b 100644 --- a/app/lib/FireflyIII/Shared/Toolkit/Reminders.php +++ b/app/lib/FireflyIII/Shared/Toolkit/Reminders.php @@ -85,6 +85,8 @@ class Reminders } } ); + $today = Carbon::now(); + //$today = new Carbon('15-12-2014'); /** @var \Piggybank $piggybank */ foreach ($set as $piggybank) { @@ -95,8 +97,8 @@ class Reminders */ /** @var \PiggybankRepetition $repetition */ $repetition = $piggybank->currentRelevantRep(); - $start = \DateKit::startOfPeriod(Carbon::now(), $piggybank->reminder); - if ($repetition->targetdate && $repetition->targetdate <= Carbon::now()) { + $start = \DateKit::startOfPeriod($today, $piggybank->reminder); + if ($repetition->targetdate && $repetition->targetdate <= $today) { // break when no longer relevant: continue; } diff --git a/app/views/repeatedexpense/show.blade.php b/app/views/repeatedexpense/show.blade.php index 3849e5e0f0..ed22a28dd4 100644 --- a/app/views/repeatedexpense/show.blade.php +++ b/app/views/repeatedexpense/show.blade.php @@ -2,7 +2,12 @@ @section('content')
+ Target amount: {{mf($piggyBank->targetamount)}}. Currently saved: {{mf($rep->currentamount)}}. +
+