diff --git a/app/Helpers/FiscalHelper.php b/app/Helpers/FiscalHelper.php new file mode 100644 index 0000000000..1d33aa5d8f --- /dev/null +++ b/app/Helpers/FiscalHelper.php @@ -0,0 +1,78 @@ +data) { + $this->useCustomFiscalYear = true; + } else { + $this->useCustomFiscalYear = false; + } + } + + /** + * @param Carbon $date + * + * @return Carbon date object + */ + public function startOfFiscalYear(Carbon $date) + { + // get start mm-dd. Then create a start date in the year passed. + $startDate = clone $date; + if ($this->useCustomFiscalYear === true) { + $prefStartStr = Preferences::get('fiscalYearStart', '01-01')->data; + list($mth, $day) = explode('-', $prefStartStr); + $startDate->month(intval($mth))->day(intval($day)); + + // if start date is after passed date, sub 1 year. + if ($startDate > $date) { + $startDate->subYear(); + } + } else { + $startDate->startOfYear(); + } + return $startDate; + } + + /** + * @param Carbon $date + * + * @return Carbon date object + */ + public function endOfFiscalYear(Carbon $date) + { + // get start of fiscal year for passed date + $endDate = $this->startOfFiscalYear($date); + if ($this->useCustomFiscalYear === true) { + // add 1 year and sub 1 day + $endDate->addYear(); + $endDate->subDay(); + } else { + $endDate->endOfYear(); + } + + + return $endDate; + } +} diff --git a/app/Helpers/FiscalHelperInterface.php b/app/Helpers/FiscalHelperInterface.php new file mode 100644 index 0000000000..55fc8b7d5e --- /dev/null +++ b/app/Helpers/FiscalHelperInterface.php @@ -0,0 +1,35 @@ +year; + $year = $fiscalHelper->endOfFiscalYear($start)->year; if (!isset($months[$year])) { $months[$year] = [ - 'start' => Carbon::createFromDate($year, 1, 1)->format('Y-m-d'), - 'end' => Carbon::createFromDate($year, 12, 31)->format('Y-m-d'), + 'start' => $fiscalHelper->startOfFiscalYear($start)->format('Y-m-d'), + 'end' => $fiscalHelper->endOfFiscalYear($start)->format('Y-m-d'), 'months' => [], ]; } diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 9cc7d3e861..461937a273 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -39,10 +39,13 @@ class PreferencesController extends Controller $budgetMax = Preferences::get('budgetMaximum', 1000); $language = Preferences::get('language', env('DEFAULT_LANGUAGE', 'en_US'))->data; $budgetMaximum = $budgetMax->data; + $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; + $fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data; + $fiscalYearStart = date('Y') . '-' . $fiscalYearStartStr; $showIncomplete = env('SHOW_INCOMPLETE_TRANSLATIONS', 'false') == 'true'; - return view('preferences.index', compact('budgetMaximum', 'language', 'accounts', 'frontPageAccounts', 'viewRange', 'showIncomplete')); + return view('preferences.index', compact('budgetMaximum', 'language', 'accounts', 'frontPageAccounts', 'viewRange', 'customFiscalYear', 'fiscalYearStart', 'showIncomplete')); } /** @@ -70,6 +73,12 @@ class PreferencesController extends Controller $budgetMaximum = intval(Input::get('budgetMaximum')); Preferences::set('budgetMaximum', $budgetMaximum); + // custom fiscal year + $customFiscalYear = (int) Input::get('customFiscalYear'); + Preferences::set('customFiscalYear', $customFiscalYear); + $fiscalYearStart = date('m-d', strtotime(Input::get('fiscalYearStart'))); + Preferences::set('fiscalYearStart', $fiscalYearStart); + // language: $lang = Input::get('language'); if (in_array($lang, array_keys(Config::get('firefly.languages')))) { diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index e14c051aae..adf8486710 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -113,6 +113,7 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind('FireflyIII\Helpers\Help\HelpInterface', 'FireflyIII\Helpers\Help\Help'); $this->app->bind('FireflyIII\Helpers\Report\ReportHelperInterface', 'FireflyIII\Helpers\Report\ReportHelper'); $this->app->bind('FireflyIII\Helpers\Report\ReportQueryInterface', 'FireflyIII\Helpers\Report\ReportQuery'); + $this->app->bind('FireflyIII\Helpers\FiscalHelperInterface', 'FireflyIII\Helpers\FiscalHelper'); } diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 6143ad0d6d..fb8aaa0b34 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -169,6 +169,10 @@ return [ 'pref_6M' => 'Six months', 'pref_languages' => 'Languages', 'pref_languages_help' => 'Firefly III supports several languages. Which one do you prefer?', + 'pref_custom_fiscal_year' => 'Fiscal year settings', + 'pref_custom_fiscal_year_label' => 'Enabled', + 'pref_custom_fiscal_year_help' => 'In countries that use a financial year other than January 1 to December 31, you can switch this on and specify start / end days of the fiscal year', + 'pref_fiscal_year_start_label' => 'Fiscal year start date', 'pref_save_settings' => 'Save settings', // profile: diff --git a/resources/views/preferences/index.twig b/resources/views/preferences/index.twig index f847fa1f6d..30416d2918 100644 --- a/resources/views/preferences/index.twig +++ b/resources/views/preferences/index.twig @@ -45,6 +45,19 @@ {{ ExpandedForm.amount('budgetMaximum',budgetMaximum,{'label' : 'Budget maximum'}) }} +
+
+

{{ 'pref_custom_fiscal_year'|_ }}

+
+
+

+ {{ 'pref_custom_fiscal_year_help'|_ }} +

+ {% set isCustomFiscalYear = customFiscalYear == 1 ? true : false %} + {{ ExpandedForm.checkbox('customFiscalYear','1',isCustomFiscalYear,{ 'label' : 'pref_custom_fiscal_year_label'|_ }) }} + {{ ExpandedForm.date('fiscalYearStart',fiscalYearStart,{ 'label' : 'pref_fiscal_year_start_label'|_ }) }} +
+