mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
First new display of piggy bank reminders.
This commit is contained in:
parent
9f23cffd1b
commit
3f716cc369
@ -1,10 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* Created by PhpStorm.
|
|
||||||
* User: sander
|
|
||||||
* Date: 06/03/15
|
|
||||||
* Time: 15:04
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace FireflyIII\Http\Middleware;
|
namespace FireflyIII\Http\Middleware;
|
||||||
|
|
||||||
@ -14,8 +8,7 @@ use Closure;
|
|||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Models\Reminder;
|
use FireflyIII\Models\Reminder;
|
||||||
use Illuminate\Contracts\Auth\Guard;
|
use Illuminate\Contracts\Auth\Guard;
|
||||||
use Log;
|
use View;
|
||||||
use Navigation;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Reminders
|
* Class Reminders
|
||||||
@ -61,69 +54,28 @@ class Reminders
|
|||||||
|
|
||||||
/** @var PiggyBank $piggyBank */
|
/** @var PiggyBank $piggyBank */
|
||||||
foreach ($piggyBanks as $piggyBank) {
|
foreach ($piggyBanks as $piggyBank) {
|
||||||
$startDate = is_null($piggyBank->startdate) ? 'null' : $piggyBank->startdate->format('d M Y');
|
$ranges = $repository->getReminderRanges($piggyBank);
|
||||||
$targetDate = is_null($piggyBank->targetdate) ? 'null' : $piggyBank->targetdate->format('d M Y');
|
|
||||||
Log::debug('PiggyBank: #' . $piggyBank->id . ', name: ' . $piggyBank->name);
|
|
||||||
Log::debug('Startdate: ' . $startDate . ', target date: ' . $targetDate);
|
|
||||||
|
|
||||||
if (!is_null($piggyBank->targetdate)) {
|
foreach ($ranges as $range) {
|
||||||
// count back until now.
|
if ($today < $range['end'] && $today > $range['start']) {
|
||||||
// echo 'Count back!<br>';
|
// create a reminder here!
|
||||||
$start = $piggyBank->targetdate;
|
$repository->createReminder($piggyBank, $range['start'], $range['end']);
|
||||||
$end = $piggyBank->startdate;
|
break;
|
||||||
|
|
||||||
while ($start >= $end) {
|
|
||||||
$currentEnd = clone $start;
|
|
||||||
$start = Navigation::subtractPeriod($start, $piggyBank->reminder, 1);
|
|
||||||
$currentStart = clone $start;
|
|
||||||
Log::debug('Now range: [' . $currentStart->format('d M Y') . '] to [' . $currentEnd->format('d M Y') . ']');
|
|
||||||
|
|
||||||
// for today?
|
|
||||||
if ($today < $currentEnd && $today > $currentStart) {
|
|
||||||
Log::debug('Today!');
|
|
||||||
|
|
||||||
// find a reminder first?
|
|
||||||
$reminders = $this->auth->user()->reminders()
|
|
||||||
->where('remindersable_id', $piggyBank->id)
|
|
||||||
->onDates($currentStart, $currentEnd)
|
|
||||||
->count();
|
|
||||||
Log::debug('Found ' . $reminders . ' reminders');
|
|
||||||
|
|
||||||
if ($reminders == 0) {
|
|
||||||
// create a reminder here!
|
|
||||||
Log::debug('create reminder!');
|
|
||||||
$repository->createReminder($piggyBank, $currentStart, $currentEnd);
|
|
||||||
}
|
|
||||||
// stop looping, we're done.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
// stop looping, we're done.
|
||||||
$start = clone $piggyBank->startdate;
|
|
||||||
while ($start < $today) {
|
|
||||||
$currentStart = clone $start;
|
|
||||||
$start = Navigation::addPeriod($start, $piggyBank->reminder, 0);
|
|
||||||
$currentEnd = clone $start;
|
|
||||||
Log::debug('Now range: [' . $currentStart->format('d M Y') . '] to [' . $currentEnd->format('d M Y') . ']');
|
|
||||||
|
|
||||||
// for today?
|
|
||||||
if ($today < $currentEnd && $today > $currentStart) {
|
|
||||||
$reminders = $this->auth->user()->reminders()
|
|
||||||
->where('remindersable_id', $piggyBank->id)
|
|
||||||
->onDates($currentStart, $currentEnd)
|
|
||||||
->count();
|
|
||||||
Log::debug('Found ' . $reminders . ' reminders');
|
|
||||||
|
|
||||||
if ($reminders == 0) {
|
|
||||||
// create a reminder here!
|
|
||||||
Log::debug('create reminder!');
|
|
||||||
$repository->createReminder($piggyBank, $currentStart, $currentEnd);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get and list active reminders:
|
||||||
|
$reminders = $this->auth->user()->reminders()->today()->get();
|
||||||
|
$reminders->each(
|
||||||
|
function (Reminder $reminder) use ($repository) {
|
||||||
|
$reminder->description = $repository->getReminderText($reminder);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
View::share('reminders', $reminders);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
|
@ -33,15 +33,21 @@ class Reminder extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param EloquentBuilder $query
|
* @param EloquentBuilder $query
|
||||||
* @param Carbon $date
|
* @param Carbon $start
|
||||||
|
* @param Carbon $end
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function scopeOnDates(EloquentBuilder $query, Carbon $start, Carbon $end)
|
public function scopeOnDates(EloquentBuilder $query, Carbon $start, Carbon $end)
|
||||||
{
|
{
|
||||||
return $query->where('reminders.startdate', '=', $start->format('Y-m-d 00:00:00'))->where('reminders.enddate', '=', $end->format('Y-m-d 00:00:00'));
|
return $query->where('reminders.startdate', '=', $start->format('Y-m-d 00:00:00'))->where('reminders.enddate', '=', $end->format('Y-m-d 00:00:00'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function scopeToday(EloquentBuilder $query) {
|
||||||
|
$today = new Carbon;
|
||||||
|
return $query->where('startdate','<=',$today->format('Y-m-d 00:00:00'))->where('enddate','>=',$today->format('Y-m-d 00:00:00'))->where('active',1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
*/
|
*/
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace FireflyIII\Repositories\PiggyBank;
|
namespace FireflyIII\Repositories\PiggyBank;
|
||||||
|
|
||||||
|
use Amount;
|
||||||
use Auth;
|
use Auth;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
@ -102,17 +103,15 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
|
|||||||
->first();
|
->first();
|
||||||
if (is_null($reminder)) {
|
if (is_null($reminder)) {
|
||||||
// create one:
|
// create one:
|
||||||
$reminder = Reminder::create(
|
$reminder = new Reminder;
|
||||||
[
|
$reminder->user()->associate(Auth::user());
|
||||||
'user_id' => Auth::user()->id,
|
$reminder->startdate = $currentStart;
|
||||||
'startdate' => $currentStart->format('Y-m-d'),
|
$reminder->enddate = $currentEnd;
|
||||||
'enddate' => $currentEnd->format('Y-m-d'),
|
$reminder->active = true;
|
||||||
'active' => '1',
|
$reminder->notnow = false;
|
||||||
'notnow' => '0',
|
$reminder->remindersable()->associate($piggyBank);
|
||||||
'remindersable_id' => $piggyBank->id,
|
$reminder->save();
|
||||||
'remindersable_type' => 'PiggyBank',
|
|
||||||
]
|
|
||||||
);
|
|
||||||
return $reminder;
|
return $reminder;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -122,6 +121,84 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine will return an array consisting of two dates which indicate the start
|
||||||
|
* and end date for each reminder that this piggy bank will have, if the piggy bank has
|
||||||
|
* any reminders. For example:
|
||||||
|
*
|
||||||
|
* [12 mar - 15 mar]
|
||||||
|
* [15 mar - 18 mar]
|
||||||
|
*
|
||||||
|
* etcetera.
|
||||||
|
*
|
||||||
|
* Array is filled with tiny arrays with Carbon objects in them.
|
||||||
|
*
|
||||||
|
* @param PiggyBank $piggyBank
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getReminderRanges(PiggyBank $piggyBank)
|
||||||
|
{
|
||||||
|
$ranges = [];
|
||||||
|
$today = new Carbon;
|
||||||
|
if ($piggyBank->remind_me === false) {
|
||||||
|
return $ranges;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($piggyBank->targetdate)) {
|
||||||
|
// count back until now.
|
||||||
|
// echo 'Count back!<br>';
|
||||||
|
$start = $piggyBank->targetdate;
|
||||||
|
$end = $piggyBank->startdate;
|
||||||
|
|
||||||
|
while ($start >= $end) {
|
||||||
|
$currentEnd = clone $start;
|
||||||
|
$start = Navigation::subtractPeriod($start, $piggyBank->reminder, 1);
|
||||||
|
$currentStart = clone $start;
|
||||||
|
$ranges[] = ['start' => clone $currentStart, 'end' => clone $currentEnd];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$start = clone $piggyBank->startdate;
|
||||||
|
while ($start < $today) {
|
||||||
|
$currentStart = clone $start;
|
||||||
|
$start = Navigation::addPeriod($start, $piggyBank->reminder, 0);
|
||||||
|
$currentEnd = clone $start;
|
||||||
|
$ranges[] = ['start' => clone $currentStart, 'end' => clone $currentEnd];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ranges;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a reminder, finds the piggy bank and tells you what to do now.
|
||||||
|
* Aka how much money to put in.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param Reminder $reminder
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getReminderText(Reminder $reminder)
|
||||||
|
{
|
||||||
|
/** @var PiggyBank $piggyBank */
|
||||||
|
$piggyBank = $reminder->remindersable;
|
||||||
|
|
||||||
|
if (is_null($piggyBank->targetdate)) {
|
||||||
|
return 'Add money to this piggy bank to reach your target of ' . Amount::format($piggyBank->targetamount);
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentRep = $piggyBank->currentRelevantRep();
|
||||||
|
|
||||||
|
|
||||||
|
$ranges = $this->getReminderRanges($piggyBank);
|
||||||
|
// calculate number of reminders:
|
||||||
|
$left = $piggyBank->targetamount - $currentRep->currentamount;
|
||||||
|
$perReminder = $left / count($ranges);
|
||||||
|
|
||||||
|
return 'Add '.Amount::format($perReminder).' to fill this piggy bank on '.$piggyBank->targetdate->format('jS F Y');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param array $data
|
||||||
*
|
*
|
||||||
|
@ -60,4 +60,37 @@ interface PiggyBankRepositoryInterface
|
|||||||
* @return PiggyBank
|
* @return PiggyBank
|
||||||
*/
|
*/
|
||||||
public function update(PiggyBank $piggyBank, array $data);
|
public function update(PiggyBank $piggyBank, array $data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a reminder, finds the piggy bank and tells you what to do now.
|
||||||
|
* Aka how much money to put in.
|
||||||
|
*
|
||||||
|
* TODO the routine to calculate the number of reminders is probably the same
|
||||||
|
* routine as is used in the Reminders-middle ware and can be used again.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param Reminder $reminder
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getReminderText(Reminder $reminder);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine will return an array consisting of two dates which indicate the start
|
||||||
|
* and end date for each reminder that this piggy bank will have, if the piggy bank has
|
||||||
|
* any reminders. For example:
|
||||||
|
*
|
||||||
|
* [12 mar - 15 mar]
|
||||||
|
* [15 mar - 18 mar]
|
||||||
|
*
|
||||||
|
* etcetera.
|
||||||
|
*
|
||||||
|
* Array is filled with tiny arrays with Carbon objects in them.
|
||||||
|
*
|
||||||
|
* @param PiggyBank $piggyBank
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getReminderRanges(PiggyBank $piggyBank);
|
||||||
}
|
}
|
@ -15,7 +15,41 @@
|
|||||||
|
|
||||||
<ul class="nav navbar-top-links navbar-right">
|
<ul class="nav navbar-top-links navbar-right">
|
||||||
|
|
||||||
|
<!-- reminders -->
|
||||||
|
@if($reminders->count() > 0)
|
||||||
|
<li class="dropdown">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="false">
|
||||||
|
<i class="fa fa-envelope fa-fw"></i> <i class="fa fa-caret-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-messages">
|
||||||
|
@foreach($reminders as $reminder)
|
||||||
|
<li>
|
||||||
|
<a href="#">
|
||||||
|
<div>
|
||||||
|
<strong>
|
||||||
|
{{$reminder->remindersable->name}}
|
||||||
|
</strong>
|
||||||
|
<span class="pull-right text-muted">
|
||||||
|
<em>{{$reminder->startdate->diffForHumans()}}</em>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div>{!! $reminder->description !!}</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
@endforeach
|
||||||
|
<li>
|
||||||
|
<a class="text-center" href="#">
|
||||||
|
<strong>See all reminders</strong>
|
||||||
|
<i class="fa fa-angle-right"></i>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<!-- /.dropdown-messages -->
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<!-- menu -->
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
|
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
|
||||||
|
Loading…
Reference in New Issue
Block a user