diff --git a/app/Helpers/Reminders/ReminderHelper.php b/app/Helpers/Reminders/ReminderHelper.php
new file mode 100644
index 0000000000..0ca4ca816d
--- /dev/null
+++ b/app/Helpers/Reminders/ReminderHelper.php
@@ -0,0 +1,140 @@
+reminders()
+ ->where('remindersable_id', $piggyBank->id)
+ ->onDates($start, $end)
+ ->first();
+ if (is_null($reminder)) {
+
+ if (!is_null($piggyBank->targetdate)) {
+ // get ranges again, but now for the start date
+ $ranges = $this->getReminderRanges($piggyBank, $start);
+ $currentRep = $piggyBank->currentRelevantRep();
+ $left = $piggyBank->targetamount - $currentRep->currentamount;
+ $perReminder = $left / count($ranges);
+ } else {
+ $perReminder = null;
+ }
+ $metaData = [
+ 'perReminder' => $perReminder
+ ];
+
+
+ // create one:
+ $reminder = new Reminder;
+ $reminder->user()->associate(Auth::user());
+ $reminder->startdate = $start;
+ $reminder->enddate = $end;
+ $reminder->active = true;
+ $reminder->metadata = $metaData;
+ $reminder->notnow = false;
+ $reminder->remindersable()->associate($piggyBank);
+ $reminder->save();
+
+ return $reminder;
+
+ } else {
+ return $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
+ * @param Carbon $date ;
+ *
+ * @return array
+ */
+ public function getReminderRanges(PiggyBank $piggyBank, Carbon $date = null)
+ {
+ $ranges = [];
+ if (is_null($date)) {
+ $date = new Carbon;
+ }
+
+ if ($piggyBank->remind_me === false) {
+ return $ranges;
+ }
+
+ if (!is_null($piggyBank->targetdate)) {
+ // count back until now.
+ // echo 'Count back!
';
+ $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 < $date) {
+ $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);
+ }
+
+ return 'Add ' . Amount::format($reminder->metadata->perReminder) . ' to fill this piggy bank on ' . $piggyBank->targetdate->format('jS F Y');
+
+ }
+}
\ No newline at end of file
diff --git a/app/Helpers/Reminders/ReminderHelperInterface.php b/app/Helpers/Reminders/ReminderHelperInterface.php
new file mode 100644
index 0000000000..cc381e1b04
--- /dev/null
+++ b/app/Helpers/Reminders/ReminderHelperInterface.php
@@ -0,0 +1,51 @@
+reminders()->get();
+ $reminders->each(function(Reminder $reminder) use ($helper) {
+ $reminder->description = $helper->getReminderText($reminder);
+ });
+
$today = new Carbon;
// active reminders:
$active = $reminders->filter(
- function (Reminder $reminder) use ($today, $repository) {
+ function (Reminder $reminder) use ($today) {
if ($reminder->notnow === false && $reminder->active === true && $reminder->startdate <= $today && $reminder->enddate >= $today) {
- $reminder->description = $repository->getReminderText($reminder);
return $reminder;
}
}
@@ -71,5 +82,16 @@ class ReminderController extends Controller
}
+ /**
+ * @param Reminder $reminder
+ */
+ public function dismiss(Reminder $reminder)
+ {
+ $reminder->notnow = true;
+ $reminder->save();
+ return Redirect::to(URL::previous());
+
+
+ }
}
diff --git a/app/Http/Middleware/Reminders.php b/app/Http/Middleware/Reminders.php
index d63b3109de..ef8f78ed27 100644
--- a/app/Http/Middleware/Reminders.php
+++ b/app/Http/Middleware/Reminders.php
@@ -49,20 +49,20 @@ class Reminders
// do reminders stuff.
$piggyBanks = $this->auth->user()->piggyBanks()->where('remind_me', 1)->get();
$today = new Carbon;
- /** @var \FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface $repository */
- $repository = App::make('FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface');
+ /** @var \FireflyIII\Helpers\Reminders\ReminderHelperInterface $helper */
+ $helper = App::make('FireflyIII\Helpers\Reminders\ReminderHelperInterface');
/** @var PiggyBank $piggyBank */
foreach ($piggyBanks as $piggyBank) {
- $ranges = $repository->getReminderRanges($piggyBank);
+ $ranges = $helper->getReminderRanges($piggyBank);
foreach ($ranges as $range) {
if ($today < $range['end'] && $today > $range['start']) {
// create a reminder here!
- $repository->createReminder($piggyBank, $range['start'], $range['end']);
+ $helper->createReminder($piggyBank, $range['start'], $range['end']);
+ // stop looping, we're done.
break;
}
- // stop looping, we're done.
}
}
@@ -71,8 +71,8 @@ class Reminders
// get and list active reminders:
$reminders = $this->auth->user()->reminders()->today()->get();
$reminders->each(
- function (Reminder $reminder) use ($repository) {
- $reminder->description = $repository->getReminderText($reminder);
+ function (Reminder $reminder) use ($helper) {
+ $reminder->description = $helper->getReminderText($reminder);
}
);
View::share('reminders', $reminders);
diff --git a/app/Http/routes.php b/app/Http/routes.php
index 3b7079f4f7..8efa3cd6c4 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -305,8 +305,10 @@ Route::group(
* Reminder Controller
*/
Route::get('/reminders', ['uses' => 'ReminderController@index', 'as' => 'reminders.index']);
+ Route::get('/reminder/dismiss/{reminder}', ['uses' => 'ReminderController@dismiss', 'as' => 'reminders.dismiss']);
Route::get('/reminder/{reminder}', ['uses' => 'ReminderController@show', 'as' => 'reminders.show']);
+
/**
* Repeated Expenses Controller
*/
diff --git a/app/Models/Reminder.php b/app/Models/Reminder.php
index 03ef1bf878..7a39b59a54 100644
--- a/app/Models/Reminder.php
+++ b/app/Models/Reminder.php
@@ -13,7 +13,7 @@ class Reminder extends Model
{
- protected $fillable = ['user_id', 'startdate', 'enddate', 'active', 'notnow', 'remindersable_id', 'remindersable_type',];
+ protected $fillable = ['user_id', 'startdate', 'metadata', 'enddate', 'active', 'notnow', 'remindersable_id', 'remindersable_type',];
/**
* @param $value
@@ -33,6 +33,16 @@ class Reminder extends Model
return ['created_at', 'updated_at', 'startdate', 'enddate'];
}
+ /**
+ * @param $value
+ *
+ * @return mixed
+ */
+ public function getMetadataAttribute($value)
+ {
+ return json_decode($value);
+ }
+
/**
* @param $value
*
@@ -67,7 +77,16 @@ class Reminder extends Model
{
$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 $query->where('startdate', '<=', $today->format('Y-m-d 00:00:00'))->where('enddate', '>=', $today->format('Y-m-d 00:00:00'))->where('active', 1)
+ ->where('notnow', 0);
+ }
+
+ /**
+ * @param $value
+ */
+ public function setMetadataAttribute($value)
+ {
+ $this->attributes['metadata'] = json_encode($value);
}
/**
diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php
index 549df90c5a..432da63ab8 100644
--- a/app/Providers/FireflyServiceProvider.php
+++ b/app/Providers/FireflyServiceProvider.php
@@ -64,6 +64,8 @@ class FireflyServiceProvider extends ServiceProvider
$this->app->bind('FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface', 'FireflyIII\Repositories\PiggyBank\PiggyBankRepository');
$this->app->bind('FireflyIII\Support\Search\SearchInterface', 'FireflyIII\Support\Search\Search');
+
+ $this->app->bind('FireflyIII\Helpers\Reminders\ReminderHelperInterface', 'FireflyIII\Helpers\Reminders\ReminderHelper');
$this->app->bind('FireflyIII\Helpers\Report\ReportHelperInterface', 'FireflyIII\Helpers\Report\ReportHelper');
$this->app->bind('FireflyIII\Helpers\Report\ReportQueryInterface', 'FireflyIII\Helpers\Report\ReportQuery');
diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php
index 63fcb00443..54a8608335 100644
--- a/app/Repositories/PiggyBank/PiggyBankRepository.php
+++ b/app/Repositories/PiggyBank/PiggyBankRepository.php
@@ -88,117 +88,6 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
return $part;
}
- /**
- * @param PiggyBank $piggyBank
- * @param Carbon $currentStart
- * @param Carbon $currentEnd
- *
- * @return Reminder
- */
- public function createReminder(PiggyBank $piggyBank, Carbon $currentStart, Carbon $currentEnd)
- {
- $reminder = Auth::user()->reminders()
- ->where('remindersable_id', $piggyBank->id)
- ->onDates($currentStart, $currentEnd)
- ->first();
- if (is_null($reminder)) {
- // create one:
- $reminder = new Reminder;
- $reminder->user()->associate(Auth::user());
- $reminder->startdate = $currentStart;
- $reminder->enddate = $currentEnd;
- $reminder->active = true;
- $reminder->notnow = false;
- $reminder->remindersable()->associate($piggyBank);
- $reminder->save();
-
- return $reminder;
-
- } else {
- return $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)
- {
- $ranges = [];
- $today = new Carbon;
- if ($piggyBank->remind_me === false) {
- return $ranges;
- }
-
- if (!is_null($piggyBank->targetdate)) {
- // count back until now.
- // echo 'Count back!
';
- $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
*
@@ -243,4 +132,5 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
return $piggyBank;
}
+
}
\ No newline at end of file
diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php
index 33e71be7a9..c65d002f1e 100644
--- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php
+++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php
@@ -37,14 +37,7 @@ interface PiggyBankRepositoryInterface
*/
public function createPiggyBankPart(array $data);
- /**
- * @param PiggyBank $piggyBank
- * @param Carbon $currentStart
- * @param Carbon $currentEnd
- *
- * @return Reminder
- */
- public function createReminder(PiggyBank $piggyBank, Carbon $currentStart, Carbon $currentEnd);
+
/**
* @param array $data
@@ -60,37 +53,4 @@ interface PiggyBankRepositoryInterface
* @return PiggyBank
*/
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);
}
\ No newline at end of file
diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php
index 168357d439..2e5ee2b16a 100644
--- a/app/Support/ExpandedForm.php
+++ b/app/Support/ExpandedForm.php
@@ -8,7 +8,7 @@ use Illuminate\Support\MessageBag;
use Input;
use Session;
use View;
-use Amount;
+use Amount as Amt;
/**
* Class ExpandedForm
@@ -33,7 +33,7 @@ class ExpandedForm
$value = $this->fillFieldValue($name, $value);
$options['step'] = 'any';
$options['min'] = '0.01';
- $defaultCurrency = isset($options['currency']) ? $options['currency'] : \Amount::getDefaultCurrency();
+ $defaultCurrency = isset($options['currency']) ? $options['currency'] : Amt::getDefaultCurrency();
$currencies = TransactionCurrency::orderBy('code', 'ASC')->get();
$html = View::make('form.amount', compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render();
@@ -128,7 +128,7 @@ class ExpandedForm
public function fillFieldValue($name, $value)
{
if (Session::has('preFilled')) {
- $preFilled = \Session::get('preFilled');
+ $preFilled = Session::get('preFilled');
$value = isset($preFilled[$name]) && is_null($value) ? $preFilled[$name] : $value;
}
if (!is_null(Input::old($name))) {
@@ -152,7 +152,7 @@ class ExpandedForm
$classes = $this->getHolderClasses($name);
$value = $this->fillFieldValue($name, $value);
$options['step'] = 'any';
- $defaultCurrency = isset($options['currency']) ? $options['currency'] : Amount::getDefaultCurrency();
+ $defaultCurrency = isset($options['currency']) ? $options['currency'] : Amt::getDefaultCurrency();
$currencies = TransactionCurrency::orderBy('code', 'ASC')->get();
$html = View::make('form.balance', compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render();
@@ -214,7 +214,7 @@ class ExpandedForm
$classes = $this->getHolderClasses($name);
$value = $this->fillFieldValue($name, $value);
$options['step'] = '1';
- $html = \View::make('form.integer', compact('classes', 'name', 'label', 'value', 'options'))->render();
+ $html = View::make('form.integer', compact('classes', 'name', 'label', 'value', 'options'))->render();
return $html;
@@ -237,7 +237,7 @@ class ExpandedForm
$selectList[0] = '(none)';
}
$fields = ['title', 'name', 'description'];
- /** @var \Eloquent $entry */
+ /** @var Eloquent $entry */
foreach ($set as $entry) {
$id = intval($entry->id);
$title = null;
@@ -261,9 +261,9 @@ class ExpandedForm
*/
public function optionsList($type, $name)
{
- $previousValue = \Input::old('post_submit_action');
+ $previousValue = Input::old('post_submit_action');
$previousValue = is_null($previousValue) ? 'store' : $previousValue;
- $html = \View::make('form.options', compact('type', 'name', 'previousValue'))->render();
+ $html = View::make('form.options', compact('type', 'name', 'previousValue'))->render();
return $html;
}
@@ -282,7 +282,7 @@ class ExpandedForm
$options = $this->expandOptionArray($name, $label, $options);
$classes = $this->getHolderClasses($name);
$selected = $this->fillFieldValue($name, $selected);
- $html = \View::make('form.select', compact('classes', 'name', 'label', 'selected', 'options', 'list'))->render();
+ $html = View::make('form.select', compact('classes', 'name', 'label', 'selected', 'options', 'list'))->render();
return $html;
}
@@ -301,7 +301,7 @@ class ExpandedForm
$classes = $this->getHolderClasses($name);
$value = $this->fillFieldValue($name, $value);
$options['data-role'] = 'tagsinput';
- $html = \View::make('form.tags', compact('classes', 'name', 'label', 'value', 'options'))->render();
+ $html = View::make('form.tags', compact('classes', 'name', 'label', 'value', 'options'))->render();
return $html;
}
diff --git a/database/migrations/2015_02_27_210653_changes_for_v332.php b/database/migrations/2015_02_27_210653_changes_for_v332.php
index f379cea4c2..3621857c2f 100644
--- a/database/migrations/2015_02_27_210653_changes_for_v332.php
+++ b/database/migrations/2015_02_27_210653_changes_for_v332.php
@@ -23,6 +23,13 @@ class ChangesForV332 extends Migration {
}
);
+ Schema::table(
+ 'reminders', function (Blueprint $table) {
+ $table->text('metadata');
+
+ }
+ );
+
}
diff --git a/database/seeds/TestDataSeeder.php b/database/seeds/TestDataSeeder.php
index b38e7fa5db..b128227920 100644
--- a/database/seeds/TestDataSeeder.php
+++ b/database/seeds/TestDataSeeder.php
@@ -328,21 +328,7 @@ class TestDataSeeder extends Seeder
{
$user = User::whereEmail('thegrumpydictator@gmail.com')->first();
// for weekly piggy bank (clothes)
- $nextWeek = clone $this->_startOfMonth;
- $piggyBank = PiggyBank::whereName('New clothes')->orderBy('id', 'DESC')->first();
- $nextWeek->addWeek();
- $week = $nextWeek->format('Y-m-d');
- Reminder::create(
- ['user_id' => $user->id, 'startdate' => $this->som, 'enddate' => $week, 'active' => 1, 'notnow' => 0,
- 'remindersable_id' => $piggyBank->id, 'remindersable_type' => 'PiggyBank']
- );
-
- // a fake reminder::
- Reminder::create(
- ['user_id' => $user->id, 'startdate' => $this->som, 'enddate' => $week, 'active' => 0, 'notnow' => 0, 'remindersable_id' => 40,
- 'remindersable_type' => 'Transaction']
- );
}
/**
@@ -371,14 +357,6 @@ class TestDataSeeder extends Seeder
'order' => 0,
]
);
-// PiggyBankRepetition::create(['piggy_bank_id' => $recurring->id, 'startdate' => $this->som, 'targetdate' => $this->eom, 'currentamount' => 0]);
-// PiggyBankRepetition::create(
-// ['piggy_bank_id' => $recurring->id, 'startdate' => $this->nsom, 'targetdate' => $this->neom, 'currentamount' => 0]
-// );
- Reminder::create(
- ['user_id' => $user->id, 'startdate' => $this->som, 'enddate' => $this->neom, 'active' => 1, 'notnow' => 0,
- 'remindersable_id' => $recurring->id, 'remindersable_type' => 'PiggyBank']
- );
}
/**
diff --git a/resources/views/list/reminders.blade.php b/resources/views/list/reminders.blade.php
index 0d5828d5e6..495157a975 100644
--- a/resources/views/list/reminders.blade.php
+++ b/resources/views/list/reminders.blade.php
@@ -1,23 +1,42 @@