mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-30 02:26:58 +00:00
Implemented a proper way of generating reminders (we hope).
This commit is contained in:
@@ -27,7 +27,7 @@ class PiggybankController extends BaseController
|
|||||||
*/
|
*/
|
||||||
public function add(Piggybank $piggybank)
|
public function add(Piggybank $piggybank)
|
||||||
{
|
{
|
||||||
/** @var \FireflyIII\Database\Piggybank $acct */
|
/** @var \FireflyIII\Database\Piggybank $repos */
|
||||||
$repos = App::make('FireflyIII\Database\Piggybank');
|
$repos = App::make('FireflyIII\Database\Piggybank');
|
||||||
|
|
||||||
$leftOnAccount = $repos->leftOnAccount($piggybank->account);
|
$leftOnAccount = $repos->leftOnAccount($piggybank->account);
|
||||||
@@ -109,9 +109,13 @@ class PiggybankController extends BaseController
|
|||||||
/*
|
/*
|
||||||
* Flash some data to fill the form.
|
* Flash some data to fill the form.
|
||||||
*/
|
*/
|
||||||
$prefilled = ['name' => $piggybank->name, 'account_id' => $piggybank->account_id, 'targetamount' => $piggybank->targetamount,
|
$prefilled = ['name' => $piggybank->name,
|
||||||
'targetdate' => !is_null($piggybank->targetdate) ? $piggybank->targetdate->format('Y-m-d') : null, 'reminder' => $piggybank->reminder,
|
'account_id' => $piggybank->account_id,
|
||||||
'remind_me' => intval($piggybank->remind_me) == 1 ? true : false];
|
'targetamount' => $piggybank->targetamount,
|
||||||
|
'targetdate' => !is_null($piggybank->targetdate) ? $piggybank->targetdate->format('Y-m-d') : null,
|
||||||
|
'reminder' => $piggybank->reminder,
|
||||||
|
'remind_me' => intval($piggybank->remind_me) == 1 || !is_null($piggybank->reminder) ? true : false
|
||||||
|
];
|
||||||
Session::flash('prefilled', $prefilled);
|
Session::flash('prefilled', $prefilled);
|
||||||
|
|
||||||
return View::make('piggybanks.edit', compact('piggybank', 'accounts', 'periods', 'prefilled'))->with('title', 'Piggybanks')->with(
|
return View::make('piggybanks.edit', compact('piggybank', 'accounts', 'periods', 'prefilled'))->with('title', 'Piggybanks')->with(
|
||||||
@@ -238,7 +242,7 @@ class PiggybankController extends BaseController
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
$amountPerReminder = $piggybank->amountPerReminder();
|
$amountPerReminder = $piggybank->amountPerReminder();
|
||||||
$remindersCount = $piggybank->countFutureReminders();
|
$remindersCount = $piggybank->countFutureReminders();
|
||||||
|
|
||||||
return View::make('piggybanks.show', compact('amountPerReminder', 'remindersCount', 'piggybank', 'events'))->with('title', 'Piggy banks')->with(
|
return View::make('piggybanks.show', compact('amountPerReminder', 'remindersCount', 'piggybank', 'events'))->with('title', 'Piggy banks')->with(
|
||||||
'mainTitleIcon', 'fa-sort-amount-asc'
|
'mainTitleIcon', 'fa-sort-amount-asc'
|
||||||
|
@@ -51,7 +51,6 @@ class Form
|
|||||||
$options['autocomplete'] = 'off';
|
$options['autocomplete'] = 'off';
|
||||||
$label = self::label($name, $options);
|
$label = self::label($name, $options);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make label and placeholder look nice.
|
* Make label and placeholder look nice.
|
||||||
*/
|
*/
|
||||||
@@ -62,7 +61,8 @@ class Form
|
|||||||
*/
|
*/
|
||||||
if (\Session::has('prefilled')) {
|
if (\Session::has('prefilled')) {
|
||||||
$prefilled = \Session::get('prefilled');
|
$prefilled = \Session::get('prefilled');
|
||||||
$value = isset($prefilled[$name]) && is_null($value) ? $prefilled[$name] : $value;
|
//$value = isset($prefilled[$name]) && is_null($value) ? $prefilled[$name] : $value;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -132,7 +132,7 @@ class Form
|
|||||||
break;
|
break;
|
||||||
case 'checkbox':
|
case 'checkbox':
|
||||||
$checked = $options['checked'];
|
$checked = $options['checked'];
|
||||||
unset($options['checked'], $options['placeholder'], $options['autocomplete'], $options['class']);
|
unset($options['placeholder'], $options['autocomplete'], $options['class']);
|
||||||
$html .= '<div class="checkbox"><label>';
|
$html .= '<div class="checkbox"><label>';
|
||||||
$html .= \Form::checkbox($name, $value, $checked, $options);
|
$html .= \Form::checkbox($name, $value, $checked, $options);
|
||||||
$html .= '</label></div>';
|
$html .= '</label></div>';
|
||||||
@@ -237,7 +237,7 @@ class Form
|
|||||||
*/
|
*/
|
||||||
public static function ffCheckbox($name, $value = 1, $checked = null, $options = [])
|
public static function ffCheckbox($name, $value = 1, $checked = null, $options = [])
|
||||||
{
|
{
|
||||||
$options['checked'] = $checked ? true : null;
|
$options['checked'] = $checked === true ? true : null;
|
||||||
|
|
||||||
return self::ffInput('checkbox', $name, $value, $options);
|
return self::ffInput('checkbox', $name, $value, $options);
|
||||||
}
|
}
|
||||||
|
@@ -69,6 +69,7 @@ class Date
|
|||||||
case 'daily':
|
case 'daily':
|
||||||
$currentEnd->addDay();
|
$currentEnd->addDay();
|
||||||
break;
|
break;
|
||||||
|
case 'week':
|
||||||
case 'weekly':
|
case 'weekly':
|
||||||
$currentEnd->addWeek()->subDay();
|
$currentEnd->addWeek()->subDay();
|
||||||
break;
|
break;
|
||||||
@@ -105,6 +106,7 @@ class Date
|
|||||||
case 'daily':
|
case 'daily':
|
||||||
$date->startOfDay();
|
$date->startOfDay();
|
||||||
break;
|
break;
|
||||||
|
case 'week':
|
||||||
case 'weekly':
|
case 'weekly':
|
||||||
$date->startOfWeek();
|
$date->startOfWeek();
|
||||||
break;
|
break;
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
namespace FireflyIII\Shared\Toolkit;
|
namespace FireflyIII\Shared\Toolkit;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Reminders
|
* Class Reminders
|
||||||
@@ -19,35 +20,24 @@ class Reminders
|
|||||||
public function getReminders()
|
public function getReminders()
|
||||||
{
|
{
|
||||||
return [];
|
return [];
|
||||||
// $reminders = \Auth::user()->reminders()->where('active', true)->get();
|
// $reminders = \Auth::user()->reminders()->where('active', true)->get();
|
||||||
// $return = [];
|
// $return = [];
|
||||||
// /** @var \Reminder $reminder */
|
// /** @var \Reminder $reminder */
|
||||||
// foreach ($reminders as $reminder) {
|
// foreach ($reminders as $reminder) {
|
||||||
// $set = ['id' => $reminder->id];
|
// $set = ['id' => $reminder->id];
|
||||||
// switch ($reminder->data->type) {
|
// switch ($reminder->data->type) {
|
||||||
// case 'Test':
|
// case 'Test':
|
||||||
// case 'Piggybank':
|
// case 'Piggybank':
|
||||||
// $set['title'] = $reminder->title;
|
// $set['title'] = $reminder->title;
|
||||||
// $set['icon'] = $reminder->data->icon;
|
// $set['icon'] = $reminder->data->icon;
|
||||||
// $set['text'] = mf(floatval($reminder->data->amount));
|
// $set['text'] = mf(floatval($reminder->data->amount));
|
||||||
// break;
|
// break;
|
||||||
//
|
//
|
||||||
// }
|
// }
|
||||||
// $return[] = $set;
|
// $return[] = $set;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// return $return;
|
// return $return;
|
||||||
}
|
|
||||||
|
|
||||||
public function updateReminders()
|
|
||||||
{
|
|
||||||
// $today = Carbon::now()->format('Y-m-d');
|
|
||||||
// $reminders = \Auth::user()->reminders()->where('startdate', '<=', $today)->where('enddate', '>=', $today)->where('active', '=', 1)->get();
|
|
||||||
//
|
|
||||||
// /*
|
|
||||||
// * Find all piggy banks in the current set of reminders.
|
|
||||||
// */
|
|
||||||
// $this->updatePiggyBankReminders();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,61 +45,114 @@ class Reminders
|
|||||||
*/
|
*/
|
||||||
public function updatePiggyBankReminders()
|
public function updatePiggyBankReminders()
|
||||||
{
|
{
|
||||||
// $piggyBanks = \Auth::user()->piggybanks()->where('targetdate', '>=', Carbon::now()->format('Y-m-d'))->whereNotNull('reminder')->where('remind_me', 1)
|
// $piggyBanks = \Auth::user()->piggybanks()->where('targetdate', '>=', Carbon::now()->format('Y-m-d'))->whereNotNull('reminder')->where('remind_me', 1)
|
||||||
// ->get();
|
// ->get();
|
||||||
//
|
//
|
||||||
// /** @var \FireflyIII\Shared\Toolkit\Date $dateKit */
|
// /** @var \FireflyIII\Shared\Toolkit\Date $dateKit */
|
||||||
// $dateKit = \App::make('FireflyIII\Shared\Toolkit\Date');
|
// $dateKit = \App::make('FireflyIII\Shared\Toolkit\Date');
|
||||||
//
|
//
|
||||||
// $today = Carbon::now();
|
// $today = Carbon::now();
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// /** @var \Piggybank $piggyBank */
|
// /** @var \Piggybank $piggyBank */
|
||||||
// foreach ($piggyBanks as $piggyBank) {
|
// foreach ($piggyBanks as $piggyBank) {
|
||||||
// /*
|
// /*
|
||||||
// * Loop from today until end?
|
// * Loop from today until end?
|
||||||
// */
|
// */
|
||||||
// $end = $piggyBank->targetdate;
|
// $end = $piggyBank->targetdate;
|
||||||
// $start = Carbon::now();
|
// $start = Carbon::now();
|
||||||
//
|
//
|
||||||
// /*
|
// /*
|
||||||
// * Create a reminder for the current period:
|
// * Create a reminder for the current period:
|
||||||
// */
|
// */
|
||||||
// /*
|
// /*
|
||||||
// * * type: Piggybank, Test
|
// * * type: Piggybank, Test
|
||||||
// * action_uri: where to go when the user wants to do this?
|
// * action_uri: where to go when the user wants to do this?
|
||||||
// * text: full text to present to user
|
// * text: full text to present to user
|
||||||
// * amount: any relevant amount.
|
// * amount: any relevant amount.
|
||||||
// * model: id of relevant model.
|
// * model: id of relevant model.
|
||||||
// */
|
// */
|
||||||
//
|
//
|
||||||
// while ($start <= $end) {
|
// while ($start <= $end) {
|
||||||
// $currentEnd = $dateKit->addPeriod(clone $start, $piggyBank->reminder, 0);
|
// $currentEnd = $dateKit->addPeriod(clone $start, $piggyBank->reminder, 0);
|
||||||
//
|
//
|
||||||
// $count = \Reminder::where('startdate',$start->format('Y-m-d'))->where('enddate',$currentEnd->format('Y-m-d'))->count();
|
// $count = \Reminder::where('startdate',$start->format('Y-m-d'))->where('enddate',$currentEnd->format('Y-m-d'))->count();
|
||||||
// if ($start >= $today && $start <= $today && $count == 0) {
|
// if ($start >= $today && $start <= $today && $count == 0) {
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// $reminder = new \Reminder;
|
// $reminder = new \Reminder;
|
||||||
// $reminder->active = 1;
|
// $reminder->active = 1;
|
||||||
// $reminder->user()->associate(\Auth::user());
|
// $reminder->user()->associate(\Auth::user());
|
||||||
// $reminder->startdate = clone $start;
|
// $reminder->startdate = clone $start;
|
||||||
// $reminder->enddate = $currentEnd;
|
// $reminder->enddate = $currentEnd;
|
||||||
// $reminder->title = 'Add money to "'.e($piggyBank->name).'"';
|
// $reminder->title = 'Add money to "'.e($piggyBank->name).'"';
|
||||||
// $amount = $piggyBank->amountPerReminder();
|
// $amount = $piggyBank->amountPerReminder();
|
||||||
// $data = ['type' => 'Piggybank', 'icon' => 'fa-sort-amount-asc', 'text' =>
|
// $data = ['type' => 'Piggybank', 'icon' => 'fa-sort-amount-asc', 'text' =>
|
||||||
// 'If you want to save up the full amount of "' . e($piggyBank->name) . '", add ' . mf($amount) . ' to account "' . e(
|
// 'If you want to save up the full amount of "' . e($piggyBank->name) . '", add ' . mf($amount) . ' to account "' . e(
|
||||||
// $piggyBank->account->name
|
// $piggyBank->account->name
|
||||||
// ) . '". Don\'t forget to connect the transfer to this piggy bank!', 'amount' => $amount, 'model' => $piggyBank->id
|
// ) . '". Don\'t forget to connect the transfer to this piggy bank!', 'amount' => $amount, 'model' => $piggyBank->id
|
||||||
//
|
//
|
||||||
// ];
|
// ];
|
||||||
// $reminder->data = $data;
|
// $reminder->data = $data;
|
||||||
// $reminder->save();
|
// $reminder->save();
|
||||||
// }
|
// }
|
||||||
// $start = $dateKit->addPeriod($start, $piggyBank->reminder, 0);
|
// $start = $dateKit->addPeriod($start, $piggyBank->reminder, 0);
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// }
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function updateReminders()
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reminder capable objects are (so far) only piggy banks.
|
||||||
|
*/
|
||||||
|
/** @var \FireflyIII\Database\Piggybank $repository */
|
||||||
|
$repository = \App::make('FireflyIII\Database\Piggybank');
|
||||||
|
|
||||||
|
/** @var \FireflyIII\Shared\Toolkit\Date $dateKit */
|
||||||
|
$dateKit = \App::make('FireflyIII\Shared\Toolkit\Date');
|
||||||
|
|
||||||
|
|
||||||
|
/** @var Collection $piggybanks */
|
||||||
|
$piggybanks = $repository->get();
|
||||||
|
$set = $piggybanks->filter(
|
||||||
|
function (\Piggybank $piggybank) {
|
||||||
|
if (!is_null($piggybank->reminder)) {
|
||||||
|
return $piggybank;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
/** @var \Piggybank $piggybank */
|
||||||
|
foreach ($set as $piggybank) {
|
||||||
|
/*
|
||||||
|
* Try to find a reminder that is valid in the current [period]
|
||||||
|
* aka between [start of period] and [end of period] as denoted
|
||||||
|
* by the piggy's repeat_freq.
|
||||||
|
*/
|
||||||
|
/** @var \PiggybankRepetition $repetition */
|
||||||
|
$repetition = $piggybank->currentRelevantRep();
|
||||||
|
$start = $dateKit->startOfPeriod(Carbon::now(), $piggybank->reminder);
|
||||||
|
if ($repetition->targetdate && $repetition->targetdate <= Carbon::now()) {
|
||||||
|
// break when no longer relevant:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$end = $dateKit->endOfPeriod(Carbon::now(), $piggybank->reminder);
|
||||||
|
// should have a reminder for this period:
|
||||||
|
/** @var \Collection $reminders */
|
||||||
|
$reminders = $piggybank->reminders()->dateIs($start, $end)->get();
|
||||||
|
if ($reminders->count() == 0) {
|
||||||
|
// create new!
|
||||||
|
$reminder = new \Reminder;
|
||||||
|
$reminder->startdate = $start;
|
||||||
|
$reminder->enddate = $end;
|
||||||
|
$reminder->user()->associate($repository->getUser());
|
||||||
|
$reminder->remindersable()->associate($piggybank);
|
||||||
|
$reminder->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@@ -42,6 +42,7 @@ use LaravelBook\Ardent\Ardent as Ardent;
|
|||||||
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereReminderSkip($value)
|
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereReminderSkip($value)
|
||||||
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereOrder($value)
|
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereOrder($value)
|
||||||
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRemindMe($value)
|
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRemindMe($value)
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|\Reminder[] $reminders
|
||||||
*/
|
*/
|
||||||
class Piggybank extends Ardent
|
class Piggybank extends Ardent
|
||||||
{
|
{
|
||||||
@@ -83,7 +84,7 @@ class Piggybank extends Ardent
|
|||||||
|
|
||||||
public function reminders()
|
public function reminders()
|
||||||
{
|
{
|
||||||
return $this->morphMany('Reminder', 'remembersable');
|
return $this->morphMany('Reminder', 'remindersable');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,8 +1,35 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use LaravelBook\Ardent\Ardent;
|
use LaravelBook\Ardent\Ardent;
|
||||||
|
|
||||||
class Reminder extends Ardent
|
/**
|
||||||
|
* Reminder
|
||||||
|
*
|
||||||
|
* @property integer $id
|
||||||
|
* @property \Carbon\Carbon $created_at
|
||||||
|
* @property \Carbon\Carbon $updated_at
|
||||||
|
* @property integer $user_id
|
||||||
|
* @property \Carbon\Carbon $startdate
|
||||||
|
* @property \Carbon\Carbon $enddate
|
||||||
|
* @property boolean $active
|
||||||
|
* @property integer $remembersable_id
|
||||||
|
* @property string $remembersable_type
|
||||||
|
* @property-read \ $remindersable
|
||||||
|
* @property-read \User $user
|
||||||
|
* @property mixed $data
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereId($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereCreatedAt($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereUpdatedAt($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereUserId($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereStartdate($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereEnddate($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereActive($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereRemembersableId($value)
|
||||||
|
* @method static \Illuminate\Database\Query\Builder|\Reminder whereRemembersableType($value)
|
||||||
|
* @method static \Reminder dateIs($start, $end)
|
||||||
|
*/
|
||||||
|
class Reminder extends Eloquent
|
||||||
{
|
{
|
||||||
|
|
||||||
protected $table = 'reminders';
|
protected $table = 'reminders';
|
||||||
@@ -35,6 +62,10 @@ class Reminder extends Ardent
|
|||||||
{
|
{
|
||||||
return $this->belongsTo('User');
|
return $this->belongsTo('User');
|
||||||
}
|
}
|
||||||
|
public function scopeDateIs($query, Carbon $start, Carbon $end)
|
||||||
|
{
|
||||||
|
return $query->where('startdate', $start->format('Y-m-d'))->where('enddate', $end->format('Y-m-d'));
|
||||||
|
}
|
||||||
|
|
||||||
public function getDataAttribute($value)
|
public function getDataAttribute($value)
|
||||||
{
|
{
|
||||||
|
@@ -48,6 +48,10 @@ use LaravelBook\Ardent\Builder;
|
|||||||
* @method static \TransactionJournal onDate($date)
|
* @method static \TransactionJournal onDate($date)
|
||||||
* @method static \TransactionJournal transactionTypes($types)
|
* @method static \TransactionJournal transactionTypes($types)
|
||||||
* @method static \TransactionJournal withRelevantData()
|
* @method static \TransactionJournal withRelevantData()
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|\
|
||||||
|
* 'Budget[] $budgets
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|\
|
||||||
|
* 'Category[] $categories
|
||||||
*/
|
*/
|
||||||
class TransactionJournal extends Ardent
|
class TransactionJournal extends Ardent
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user