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 @@
-@foreach($reminders as $reminder) -
-
-
- Reminder for piggy bank "{{$reminder->remindersable->name}}" -
-
- @if(isset($reminder->description)) - {!! $reminder->description !!} - @endif -
- \ No newline at end of file