diff --git a/app/Http/Middleware/Range.php b/app/Http/Middleware/Range.php new file mode 100644 index 0000000000..e4b082dca7 --- /dev/null +++ b/app/Http/Middleware/Range.php @@ -0,0 +1,293 @@ +auth = $auth; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $theNext + * + * @return mixed + */ + public function handle($request, Closure $theNext) + { + if ($this->auth->check()) { + // user's view range comes from preferences, gets set in session: + /** @var \FireflyIII\Models\Preference $viewRange */ + $viewRange = Preferences::get('viewRange', '1M'); + + + // the start and end date are checked and stored: + $start = Session::has('start') ? Session::get('start') : new Carbon; + $start = $this->updateStartDate($viewRange->data, $start); + $end = $this->updateEndDate($viewRange->data, $start); + $period = $this->periodName($viewRange->data, $start); + $prev = $this->previous($viewRange->data, clone $start); + $next = $this->next($viewRange->data, clone $start); + + Session::put('range', $viewRange->data); + Session::put('start', $start); + Session::put('end', $end); + Session::put('period', $period); + Session::put('prev', $this->periodName($viewRange->data, $prev)); + Session::put('next', $this->periodName($viewRange->data, $next)); + + } + + return $theNext($request); + + } + + /** + * @param $range + * @param Carbon $start + * + * @return Carbon + * @throws FireflyException + * @codeCoverageIgnore + */ + protected function updateStartDate($range, Carbon $start) + { + $functionMap = [ + '1D' => 'startOfDay', + '1W' => 'startOfWeek', + '1M' => 'startOfMonth', + '3M' => 'firstOfQuarter', + '1Y' => 'startOfYear', + ]; + if (isset($functionMap[$range])) { + $function = $functionMap[$range]; + $start->$function(); + + return $start; + } + if ($range == '6M') { + if (intval($start->format('m')) >= 7) { + $start->startOfYear()->addMonths(6); + } else { + $start->startOfYear(); + } + + return $start; + } + throw new FireflyException('updateStartDate cannot handle $range ' . $range); + } + + /** + * @param $range + * @param Carbon $start + * + * @return Carbon + * @throws FireflyException + * @codeCoverageIgnore + */ + protected function updateEndDate($range, Carbon $start) + { + $functionMap = [ + '1D' => 'endOfDay', + '1W' => 'endOfWeek', + '1M' => 'endOfMonth', + '3M' => 'lastOfQuarter', + '1Y' => 'endOfYear', + ]; + $end = clone $start; + + if (isset($functionMap[$range])) { + $function = $functionMap[$range]; + $end->$function(); + + return $end; + } + if ($range == '6M') { + if (intval($start->format('m')) >= 7) { + $end->endOfYear(); + } else { + $end->startOfYear()->addMonths(6); + } + + return $end; + } + throw new FireflyException('updateEndDate cannot handle $range ' . $range); + } + + /** + * @SuppressWarnings("CyclomaticComplexity") // It's exactly 5. So I don't mind. + * + * @param $range + * @param Carbon $date + * + * @return string + * @throws FireflyException + * @codeCoverageIgnore + */ + protected function periodName($range, Carbon $date) + { + $formatMap = [ + '1D' => 'jS F Y', + '1W' => '\w\e\ek W, Y', + '1M' => 'F Y', + '1Y' => 'Y', + ]; + if (isset($formatMap[$range])) { + return $date->format($formatMap[$range]); + } + if ($range == '3M') { + $month = intval($date->format('m')); + + return 'Q' . ceil(($month / 12) * 4) . ' ' . $date->format('Y'); + } + if ($range == '6M') { + $month = intval($date->format('m')); + $half = ceil(($month / 12) * 2); + $halfName = $half == 1 ? 'first' : 'second'; + + return $halfName . ' half of ' . $date->format('d-m-Y'); + } + throw new FireflyException('No _periodName() for range "' . $range . '"'); + } + + /** + * @param $range + * @param Carbon $date + * + * @return Carbon + * @throws FireflyException + */ + public function previous($range, Carbon $date) + { + $functionMap = [ + '1D' => 'Day', + '1W' => 'Week', + '1M' => 'Month', + '1Y' => 'Year' + ]; + + if (isset($functionMap[$range])) { + $startFunction = 'startOf' . $functionMap[$range]; + $subFunction = 'sub' . $functionMap[$range]; + $date->$startFunction()->$subFunction(); + + return $date; + } + if ($range == '3M') { + $date->firstOfQuarter()->subMonths(3)->firstOfQuarter(); + + return $date; + } + if ($range == '6M') { + $month = intval($date->format('m')); + $date->startOfYear(); + if ($month <= 6) { + $date->subMonths(6); + } + + return $date; + } + throw new FireflyException('Cannot do _previous() on ' . $range); + } + + /** + * @param $range + * @param Carbon $date + * + * @return Carbon + * @throws FireflyException + */ + public function next($range, Carbon $date) + { + switch ($range) { + case '1D': + $date->endOfDay()->addDay(); + break; + case '1W': + $date->endOfWeek()->addDay()->startOfWeek(); + break; + case '1M': + $date->endOfMonth()->addDay()->startOfMonth(); + break; + case '3M': + $date->lastOfQuarter()->addDay(); + break; + case '6M': + if (intval($date->format('m')) >= 7) { + $date->startOfYear()->addYear(); + } else { + $date->startOfYear()->addMonths(6); + } + break; + case '1Y': + $date->startOfYear()->addYear(); + break; + default: + throw new FireflyException('Cannot do _next() on ' . $range); + break; + } + + return $date; + } + + /** + * Checks and sets the currently set 'range' or defaults to a session + * and if that fails, defaults to 1M. Always returns the final value. + * + * @return string + */ + public function setSessionRangeValue() + { + $viewRange = Preferences::get('viewRange', '1M'); + if (!is_null(Session::get('range'))) { + // @codeCoverageIgnoreStart + $range = Session::get('range'); + // @codeCoverageIgnoreEnd + } else { + Preferences::get('viewRange', '1M'); + // /** @var \FireflyIII\Shared\Preferences\PreferencesInterface $preferences */ + // $preferences = \App::make('FireflyIII\Shared\Preferences\PreferencesInterface'); + // $viewRange = $preferences->get('viewRange', '1M'); + // $range = $viewRange->data; + $range = '1M'; + Session::put('range', $range); + } + + return $range; + + } + + +} \ No newline at end of file diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php new file mode 100644 index 0000000000..c15d4985cb --- /dev/null +++ b/app/Providers/FireflyServiceProvider.php @@ -0,0 +1,18 @@ +app->bind( + 'preferences', function () { + return new \FireflyIII\Support\Preferences; + } + ); + } + +} \ No newline at end of file diff --git a/app/Support/Facades/Preferences.php b/app/Support/Facades/Preferences.php new file mode 100644 index 0000000000..70ef74965b --- /dev/null +++ b/app/Support/Facades/Preferences.php @@ -0,0 +1,23 @@ +id)->where('name', $name)->first(); + if (is_null($pref) && is_null($default)) { + // return NULL + return null; + } + if (!is_null($pref)) { + return $pref; + } + + return $this->set($name, $default); + + } + + /** + * @param $name + * @param $value + * + * @return \Preference + */ + public function set($name, $value) + { + $pref = Preference::where('user_id', Auth::user()->id)->where('name', $name)->first(); + if (is_null($pref)) { + $pref = new Preference; + $pref->name = $name; + $pref->user()->associate(Auth::user()); + + } + $pref->data = $value; + $pref->save(); + + + return $pref; + + } +} \ No newline at end of file diff --git a/config/app.php b/config/app.php index 5dc7850701..2f946b781e 100644 --- a/config/app.php +++ b/config/app.php @@ -136,6 +136,7 @@ return [ 'Illuminate\Validation\ValidationServiceProvider', 'Illuminate\View\ViewServiceProvider', 'Illuminate\Html\HtmlServiceProvider', + 'Barryvdh\Debugbar\ServiceProvider', 'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', /* diff --git a/storage/debugbar/.gitignore b/storage/debugbar/.gitignore new file mode 100644 index 0000000000..c96a04f008 --- /dev/null +++ b/storage/debugbar/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file