firefly-iii/app/Support/Navigation.php

574 lines
18 KiB
PHP
Raw Normal View History

2015-02-06 14:23:14 -06:00
<?php
/**
* Navigation.php
2017-10-21 01:40:00 -05:00
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
2017-10-21 01:40:00 -05:00
* This file is part of Firefly III.
*
2017-10-21 01:40:00 -05:00
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
2017-12-17 07:44:05 -06:00
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
2015-02-06 14:23:14 -06:00
namespace FireflyIII\Support;
use Carbon\Carbon;
2015-02-22 02:46:21 -06:00
use FireflyIII\Exceptions\FireflyException;
2017-12-23 10:42:07 -06:00
use Log;
2015-02-06 14:23:14 -06:00
/**
2017-11-15 05:25:49 -06:00
* Class Navigation.
2015-02-06 14:23:14 -06:00
*/
class Navigation
{
2015-02-22 08:40:13 -06:00
/**
2015-05-05 03:23:01 -05:00
* @param \Carbon\Carbon $theDate
2015-02-25 08:19:14 -06:00
* @param $repeatFreq
* @param $skip
2015-02-22 08:40:13 -06:00
*
2015-02-25 08:19:14 -06:00
* @return \Carbon\Carbon
2017-11-15 05:25:49 -06:00
*
2015-02-22 08:40:13 -06:00
* @throws FireflyException
*/
2016-04-05 15:00:03 -05:00
public function addPeriod(Carbon $theDate, string $repeatFreq, int $skip): Carbon
2015-02-22 08:40:13 -06:00
{
2015-02-25 08:19:14 -06:00
$date = clone $theDate;
$add = ($skip + 1);
2015-02-22 08:40:13 -06:00
2015-02-25 08:19:14 -06:00
$functionMap = [
2015-05-17 02:35:49 -05:00
'1D' => 'addDays', 'daily' => 'addDays',
'1W' => 'addWeeks', 'weekly' => 'addWeeks', 'week' => 'addWeeks',
'1M' => 'addMonths', 'month' => 'addMonths', 'monthly' => 'addMonths', '3M' => 'addMonths',
'quarter' => 'addMonths', 'quarterly' => 'addMonths', '6M' => 'addMonths', 'half-year' => 'addMonths',
2016-10-04 14:51:46 -05:00
'year' => 'addYears', 'yearly' => 'addYears', '1Y' => 'addYears',
2016-12-10 00:29:36 -06:00
'custom' => 'addMonths', // custom? just add one month.
2015-02-22 08:40:13 -06:00
];
2015-02-25 08:19:14 -06:00
$modifierMap = [
'quarter' => 3,
2015-03-04 02:42:47 -06:00
'3M' => 3,
2015-02-25 08:19:14 -06:00
'quarterly' => 3,
2015-03-04 02:42:47 -06:00
'6M' => 6,
2015-02-25 08:19:14 -06:00
'half-year' => 6,
];
2015-06-06 16:09:12 -05:00
2015-02-25 08:19:14 -06:00
if (!isset($functionMap[$repeatFreq])) {
throw new FireflyException(sprintf('Cannot do addPeriod for $repeat_freq "%s"', $repeatFreq));
2015-02-22 08:40:13 -06:00
}
2015-02-25 08:19:14 -06:00
if (isset($modifierMap[$repeatFreq])) {
$add = $add * $modifierMap[$repeatFreq];
}
$function = $functionMap[$repeatFreq];
$date->$function($add);
2017-09-25 00:32:29 -05:00
// if period is 1M and diff in month is 2 and new DOM = 1, sub a day:
$months = ['1M', 'month', 'monthly'];
$difference = $date->month - $theDate->month;
2017-11-15 05:25:49 -06:00
if (in_array($repeatFreq, $months) && 2 === $difference && 1 === $date->day) {
2017-09-25 00:32:29 -05:00
$date->subDay();
}
2015-02-25 08:19:14 -06:00
return $date;
2015-02-22 08:40:13 -06:00
}
2015-02-25 08:19:14 -06:00
/**
2016-04-24 13:23:17 -05:00
* @param \Carbon\Carbon $end
2015-02-25 08:19:14 -06:00
* @param $repeatFreq
*
2015-05-05 03:23:01 -05:00
* @return \Carbon\Carbon
2017-11-15 05:25:49 -06:00
*
2015-02-25 08:19:14 -06:00
* @throws FireflyException
*/
2017-03-11 00:41:26 -06:00
public function endOfPeriod(\Carbon\Carbon $end, string $repeatFreq): Carbon
2015-02-25 08:19:14 -06:00
{
2016-04-24 13:23:17 -05:00
$currentEnd = clone $end;
2015-02-25 08:19:14 -06:00
$functionMap = [
2016-04-24 13:23:17 -05:00
'1D' => 'endOfDay', 'daily' => 'endOfDay',
2015-05-17 03:30:18 -05:00
'1W' => 'addWeek', 'week' => 'addWeek', 'weekly' => 'addWeek',
'1M' => 'addMonth', 'month' => 'addMonth', 'monthly' => 'addMonth',
'3M' => 'addMonths', 'quarter' => 'addMonths', 'quarterly' => 'addMonths', '6M' => 'addMonths', 'half-year' => 'addMonths',
'year' => 'addYear', 'yearly' => 'addYear', '1Y' => 'addYear',
2015-02-25 08:19:14 -06:00
];
$modifierMap = [
'quarter' => 3,
2015-03-04 02:42:47 -06:00
'3M' => 3,
2015-02-25 08:19:14 -06:00
'quarterly' => 3,
'half-year' => 6,
2015-03-04 02:42:47 -06:00
'6M' => 6,
2015-02-25 08:19:14 -06:00
];
2015-03-04 02:42:47 -06:00
$subDay = ['week', 'weekly', '1W', 'month', 'monthly', '1M', '3M', 'quarter', 'quarterly', '6M', 'half-year', 'year', 'yearly'];
2015-02-25 08:19:14 -06:00
2016-02-05 00:16:55 -06:00
// if the range is custom, the end of the period
// is another X days (x is the difference between start)
// and end added to $theCurrentEnd
2017-11-15 05:25:49 -06:00
if ('custom' === $repeatFreq) {
2016-02-05 00:16:55 -06:00
/** @var Carbon $tStart */
$tStart = session('start', Carbon::now()->startOfMonth());
/** @var Carbon $tEnd */
$tEnd = session('end', Carbon::now()->endOfMonth());
$diffInDays = $tStart->diffInDays($tEnd);
$currentEnd->addDays($diffInDays);
return $currentEnd;
}
2015-02-25 08:19:14 -06:00
if (!isset($functionMap[$repeatFreq])) {
throw new FireflyException(sprintf('Cannot do endOfPeriod for $repeat_freq "%s"', $repeatFreq));
2015-02-25 08:19:14 -06:00
}
$function = $functionMap[$repeatFreq];
if (isset($modifierMap[$repeatFreq])) {
$currentEnd->$function($modifierMap[$repeatFreq]);
if (in_array($repeatFreq, $subDay)) {
$currentEnd->subDay();
}
return $currentEnd;
2015-02-25 08:19:14 -06:00
}
$currentEnd->$function();
2015-02-25 08:19:14 -06:00
if (in_array($repeatFreq, $subDay)) {
$currentEnd->subDay();
}
return $currentEnd;
}
2015-02-22 08:40:13 -06:00
2015-02-27 04:02:08 -06:00
/**
2017-01-05 03:06:46 -06:00
* @param \Carbon\Carbon $theCurrentEnd
* @param string $repeatFreq
* @param \Carbon\Carbon|null $maxDate
2015-02-27 04:02:08 -06:00
*
2017-01-05 03:06:46 -06:00
* @return Carbon
2015-02-27 04:02:08 -06:00
*/
2017-07-23 12:06:24 -05:00
public function endOfX(Carbon $theCurrentEnd, string $repeatFreq, ?Carbon $maxDate): Carbon
2015-02-27 04:02:08 -06:00
{
$functionMap = [
2015-09-25 10:28:42 -05:00
'1D' => 'endOfDay',
2015-02-27 04:02:08 -06:00
'daily' => 'endOfDay',
2015-09-25 10:28:42 -05:00
'1W' => 'endOfWeek',
2015-02-27 04:02:08 -06:00
'week' => 'endOfWeek',
'weekly' => 'endOfWeek',
'month' => 'endOfMonth',
2015-09-25 09:00:14 -05:00
'1M' => 'endOfMonth',
2015-02-27 04:02:08 -06:00
'monthly' => 'endOfMonth',
2015-09-25 10:28:42 -05:00
'3M' => 'lastOfQuarter',
2015-02-27 04:02:08 -06:00
'quarter' => 'lastOfQuarter',
'quarterly' => 'lastOfQuarter',
2015-09-25 10:28:42 -05:00
'1Y' => 'endOfYear',
2015-02-27 04:02:08 -06:00
'year' => 'endOfYear',
'yearly' => 'endOfYear',
];
$currentEnd = clone $theCurrentEnd;
if (isset($functionMap[$repeatFreq])) {
$function = $functionMap[$repeatFreq];
$currentEnd->$function();
}
2015-06-29 02:14:39 -05:00
2017-11-15 05:25:49 -06:00
if (null !== $maxDate && $currentEnd > $maxDate) {
2015-02-27 04:02:08 -06:00
return clone $maxDate;
}
return $currentEnd;
}
2016-11-19 06:37:44 -06:00
/**
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
*
* @return array
*/
public function listOfPeriods(Carbon $start, Carbon $end): array
{
// define period to increment
$increment = 'addDay';
2016-11-26 01:41:15 -06:00
$format = self::preferredCarbonFormat($start, $end);
2016-11-19 06:37:44 -06:00
$displayFormat = strval(trans('config.month_and_day'));
// increment by month (for year)
if ($start->diffInMonths($end) > 1) {
$increment = 'addMonth';
$displayFormat = strval(trans('config.month'));
}
// increment by year (for multi year)
if ($start->diffInMonths($end) > 12) {
$increment = 'addYear';
$displayFormat = strval(trans('config.year'));
}
$begin = clone $start;
$entries = [];
while ($begin < $end) {
$formatted = $begin->format($format);
$displayed = $begin->formatLocalized($displayFormat);
$entries[$formatted] = $displayed;
$begin->$increment();
}
return $entries;
}
2015-02-25 08:19:14 -06:00
/**
2017-10-15 07:05:31 -05:00
* @param \Carbon\Carbon $theDate
2015-02-25 08:19:14 -06:00
* @param $repeatFrequency
*
* @return string
2017-11-15 05:25:49 -06:00
*
2015-02-25 08:19:14 -06:00
* @throws FireflyException
*/
2017-10-15 07:05:31 -05:00
public function periodShow(Carbon $theDate, string $repeatFrequency): string
2015-02-25 08:19:14 -06:00
{
2017-11-01 09:34:08 -05:00
$date = clone $theDate;
2015-02-25 08:19:14 -06:00
$formatMap = [
'1D' => trans('config.specific_day'),
'daily' => trans('config.specific_day'),
'custom' => trans('config.specific_day'),
'1W' => trans('config.week_in_year'),
'week' => trans('config.week_in_year'),
'weekly' => trans('config.week_in_year'),
'1M' => trans('config.month'),
'month' => trans('config.month'),
'monthly' => trans('config.month'),
'1Y' => trans('config.year'),
'year' => trans('config.year'),
'yearly' => trans('config.year'),
'6M' => trans('config.half_year'),
2015-02-25 08:19:14 -06:00
];
2015-05-25 14:17:36 -05:00
2015-02-25 08:19:14 -06:00
if (isset($formatMap[$repeatFrequency])) {
2016-02-10 09:23:37 -06:00
return $date->formatLocalized(strval($formatMap[$repeatFrequency]));
2015-02-25 08:19:14 -06:00
}
2017-11-15 05:25:49 -06:00
if ('3M' === $repeatFrequency || 'quarter' === $repeatFrequency) {
2017-11-01 09:34:08 -05:00
$quarter = ceil($theDate->month / 3);
return sprintf('Q%d %d', $quarter, $theDate->year);
}
// special formatter for quarter of year
throw new FireflyException(sprintf('No date formats for frequency "%s"!', $repeatFrequency));
2015-02-25 08:19:14 -06:00
}
2016-12-15 06:47:28 -06:00
/**
2016-12-30 06:47:23 -06:00
* If the date difference between start and end is less than a month, method returns "Y-m-d". If the difference is less than a year,
* method returns "Y-m". If the date difference is larger, method returns "Y".
2016-12-15 06:47:28 -06:00
*
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
*
* @return string
*/
2016-12-30 06:47:23 -06:00
public function preferredCarbonFormat(Carbon $start, Carbon $end): string
2016-12-15 06:47:28 -06:00
{
2016-12-30 06:47:23 -06:00
$format = 'Y-m-d';
2016-12-15 06:47:28 -06:00
if ($start->diffInMonths($end) > 1) {
2016-12-30 06:47:23 -06:00
$format = 'Y-m';
2016-12-15 06:47:28 -06:00
}
if ($start->diffInMonths($end) > 12) {
2016-12-30 06:47:23 -06:00
$format = 'Y';
2016-12-15 06:47:28 -06:00
}
2016-12-30 06:47:23 -06:00
2016-12-15 06:47:28 -06:00
return $format;
}
2016-11-26 01:41:15 -06:00
/**
2016-12-30 06:47:23 -06:00
* If the date difference between start and end is less than a month, method returns trans(config.month_and_day). If the difference is less than a year,
* method returns "config.month". If the date difference is larger, method returns "config.year".
2016-11-26 01:41:15 -06:00
*
2016-12-03 13:38:13 -06:00
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
2016-11-26 01:41:15 -06:00
*
* @return string
*/
2016-12-30 06:47:23 -06:00
public function preferredCarbonLocalizedFormat(Carbon $start, Carbon $end): string
2016-11-26 01:41:15 -06:00
{
2016-12-30 06:47:23 -06:00
$format = strval(trans('config.month_and_day'));
2016-11-26 01:41:15 -06:00
if ($start->diffInMonths($end) > 1) {
2016-12-30 06:47:23 -06:00
$format = strval(trans('config.month'));
2016-11-26 01:41:15 -06:00
}
if ($start->diffInMonths($end) > 12) {
2016-12-30 06:47:23 -06:00
$format = strval(trans('config.year'));
2016-11-26 01:41:15 -06:00
}
2016-12-30 06:47:23 -06:00
2016-12-15 06:47:28 -06:00
return $format;
}
/**
2016-12-30 06:47:23 -06:00
* If the date difference between start and end is less than a month, method returns "endOfDay". If the difference is less than a year,
* method returns "endOfMonth". If the date difference is larger, method returns "endOfYear".
2016-12-15 06:47:28 -06:00
*
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
*
* @return string
*/
2016-12-30 06:47:23 -06:00
public function preferredEndOfPeriod(Carbon $start, Carbon $end): string
2016-12-15 06:47:28 -06:00
{
2016-12-30 06:47:23 -06:00
$format = 'endOfDay';
2016-12-15 06:47:28 -06:00
if ($start->diffInMonths($end) > 1) {
2016-12-30 06:47:23 -06:00
$format = 'endOfMonth';
2016-12-15 06:47:28 -06:00
}
if ($start->diffInMonths($end) > 12) {
2016-12-30 06:47:23 -06:00
$format = 'endOfYear';
2016-12-15 06:47:28 -06:00
}
2016-11-26 01:41:15 -06:00
return $format;
}
/**
* If the date difference between start and end is less than a month, method returns "1D". If the difference is less than a year,
* method returns "1M". If the date difference is larger, method returns "1Y".
*
2016-12-03 13:38:13 -06:00
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
2016-11-26 01:41:15 -06:00
*
* @return string
*/
public function preferredRangeFormat(Carbon $start, Carbon $end): string
{
$format = '1D';
if ($start->diffInMonths($end) > 1) {
$format = '1M';
}
if ($start->diffInMonths($end) > 12) {
$format = '1Y';
}
return $format;
}
/**
* If the date difference between start and end is less than a month, method returns "%Y-%m-%d". If the difference is less than a year,
* method returns "%Y-%m". If the date difference is larger, method returns "%Y".
*
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
*
* @return string
*/
public function preferredSqlFormat(Carbon $start, Carbon $end): string
{
$format = '%Y-%m-%d';
if ($start->diffInMonths($end) > 1) {
$format = '%Y-%m';
}
if ($start->diffInMonths($end) > 12) {
$format = '%Y';
}
return $format;
}
2015-02-25 08:19:14 -06:00
/**
2015-05-05 03:23:01 -05:00
* @param \Carbon\Carbon $theDate
2015-02-25 08:19:14 -06:00
* @param $repeatFreq
*
2015-05-05 03:23:01 -05:00
* @return \Carbon\Carbon
2017-11-15 05:25:49 -06:00
*
2015-02-25 08:19:14 -06:00
* @throws FireflyException
*/
2016-04-05 15:00:03 -05:00
public function startOfPeriod(Carbon $theDate, string $repeatFreq): Carbon
2015-02-25 08:19:14 -06:00
{
$date = clone $theDate;
$functionMap = [
2015-03-04 02:42:47 -06:00
'1D' => 'startOfDay',
2015-03-03 10:40:17 -06:00
'daily' => 'startOfDay',
2015-03-04 02:42:47 -06:00
'1W' => 'startOfWeek',
2015-03-03 10:40:17 -06:00
'week' => 'startOfWeek',
'weekly' => 'startOfWeek',
'month' => 'startOfMonth',
2015-03-04 02:42:47 -06:00
'1M' => 'startOfMonth',
2015-03-03 10:40:17 -06:00
'monthly' => 'startOfMonth',
2015-03-04 02:42:47 -06:00
'3M' => 'firstOfQuarter',
2015-03-03 10:40:17 -06:00
'quarter' => 'firstOfQuarter',
'quarterly' => 'firstOfQuarter',
'year' => 'startOfYear',
'yearly' => 'startOfYear',
'1Y' => 'startOfYear',
2015-02-25 08:19:14 -06:00
];
if (isset($functionMap[$repeatFreq])) {
$function = $functionMap[$repeatFreq];
$date->$function();
return $date;
}
2017-11-15 05:25:49 -06:00
if ('half-year' === $repeatFreq || '6M' === $repeatFreq) {
2015-05-05 03:30:39 -05:00
$month = $date->month;
2015-02-25 08:19:14 -06:00
$date->startOfYear();
if ($month >= 7) {
$date->addMonths(6);
}
return $date;
}
2017-11-15 05:25:49 -06:00
if ('custom' === $repeatFreq) {
return $date; // the date is already at the start.
}
throw new FireflyException(sprintf('Cannot do startOfPeriod for $repeat_freq "%s"', $repeatFreq));
2015-02-25 08:19:14 -06:00
}
2015-03-29 14:27:51 -05:00
/**
2015-12-31 10:20:54 -06:00
* @param \Carbon\Carbon $theDate
2015-03-29 14:27:51 -05:00
* @param $repeatFreq
* @param int $subtract
*
2015-12-31 10:20:54 -06:00
* @return \Carbon\Carbon
2017-11-15 05:25:49 -06:00
*
2015-03-29 14:27:51 -05:00
* @throws FireflyException
*/
2016-04-05 15:00:03 -05:00
public function subtractPeriod(Carbon $theDate, string $repeatFreq, int $subtract = 1): Carbon
2015-03-29 14:27:51 -05:00
{
$date = clone $theDate;
2015-09-25 10:28:42 -05:00
// 1D 1W 1M 3M 6M 1Y
2017-12-23 10:42:07 -06:00
Log::debug(sprintf('subtractPeriod: date is %s', $date->format('Y-m-d')));
2015-03-29 14:27:51 -05:00
$functionMap = [
2015-09-25 10:28:42 -05:00
'1D' => 'subDays',
2015-03-29 14:27:51 -05:00
'daily' => 'subDays',
'week' => 'subWeeks',
2015-09-25 10:28:42 -05:00
'1W' => 'subWeeks',
2015-03-29 14:27:51 -05:00
'weekly' => 'subWeeks',
'month' => 'subMonths',
2015-09-25 09:00:14 -05:00
'1M' => 'subMonths',
2015-03-29 14:27:51 -05:00
'monthly' => 'subMonths',
'year' => 'subYears',
'1Y' => 'subYears',
2015-03-29 14:27:51 -05:00
'yearly' => 'subYears',
];
$modifierMap = [
'quarter' => 3,
'3M' => 3,
2015-03-29 14:27:51 -05:00
'quarterly' => 3,
'half-year' => 6,
'6M' => 6,
2015-03-29 14:27:51 -05:00
];
if (isset($functionMap[$repeatFreq])) {
$function = $functionMap[$repeatFreq];
$date->$function($subtract);
2017-12-23 10:42:07 -06:00
Log::debug(sprintf('%s is in function map, execute %s with argument %d', $repeatFreq, $function, $subtract));
Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d')));
2015-03-29 14:27:51 -05:00
return $date;
}
if (isset($modifierMap[$repeatFreq])) {
$subtract = $subtract * $modifierMap[$repeatFreq];
$date->subMonths($subtract);
2017-12-23 10:42:07 -06:00
Log::debug(sprintf('%s is in modifier map with value %d, execute subMonths with argument %d', $repeatFreq, $modifierMap[$repeatFreq], $subtract));
Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d')));
2015-03-29 14:27:51 -05:00
return $date;
}
// a custom range requires the session start
// and session end to calculate the difference in days.
// this is then subtracted from $theDate (* $subtract).
2017-11-15 05:25:49 -06:00
if ('custom' === $repeatFreq) {
/** @var Carbon $tStart */
$tStart = session('start', Carbon::now()->startOfMonth());
/** @var Carbon $tEnd */
$tEnd = session('end', Carbon::now()->endOfMonth());
$diffInDays = $tStart->diffInDays($tEnd);
2017-12-23 10:42:07 -06:00
Log::debug(sprintf('repeatFreq is %s, start is %s and end is %s (session data).', $repeatFreq, $tStart->format('Y-m-d'), $tEnd->format('Y-m-d')));
Log::debug(sprintf('Diff in days is %d', $diffInDays));
$date->subDays($diffInDays * $subtract);
2017-12-23 10:42:07 -06:00
Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d')));
2016-02-05 02:30:06 -06:00
return $date;
}
2015-03-29 14:27:51 -05:00
throw new FireflyException(sprintf('Cannot do subtractPeriod for $repeat_freq "%s"', $repeatFreq));
2015-03-29 14:27:51 -05:00
}
2015-02-11 00:35:10 -06:00
/**
* @param $range
2015-05-05 03:23:01 -05:00
* @param \Carbon\Carbon $start
2015-02-11 00:35:10 -06:00
*
2015-05-05 03:23:01 -05:00
* @return \Carbon\Carbon
2017-11-15 05:25:49 -06:00
*
2015-02-11 00:35:10 -06:00
* @throws FireflyException
*/
2016-04-05 15:00:03 -05:00
public function updateEndDate(string $range, Carbon $start): Carbon
2015-02-06 14:23:14 -06:00
{
$functionMap = [
2016-11-20 00:24:18 -06:00
'1D' => 'endOfDay',
'1W' => 'endOfWeek',
'1M' => 'endOfMonth',
'3M' => 'lastOfQuarter',
'1Y' => 'endOfYear',
'custom' => 'startOfMonth', // this only happens in test situations.
2015-02-06 14:23:14 -06:00
];
2015-06-05 09:49:16 -05:00
$end = clone $start;
2015-02-06 14:23:14 -06:00
if (isset($functionMap[$range])) {
$function = $functionMap[$range];
$end->$function();
return $end;
}
2017-11-15 05:25:49 -06:00
if ('6M' === $range) {
2015-05-05 03:30:39 -05:00
if ($start->month >= 7) {
2015-02-06 14:23:14 -06:00
$end->endOfYear();
2016-05-20 10:58:10 -05:00
return $end;
2015-02-06 14:23:14 -06:00
}
2016-05-20 10:58:10 -05:00
$end->startOfYear()->addMonths(6);
2015-02-06 14:23:14 -06:00
return $end;
}
throw new FireflyException(sprintf('updateEndDate cannot handle range "%s"', $range));
2015-02-06 14:23:14 -06:00
}
2015-02-11 00:35:10 -06:00
/**
2015-05-05 03:23:01 -05:00
* @param $range
* @param \Carbon\Carbon $start
2015-02-11 00:35:10 -06:00
*
2015-05-05 03:23:01 -05:00
* @return \Carbon\Carbon
2017-11-15 05:25:49 -06:00
*
2015-02-11 00:35:10 -06:00
* @throws FireflyException
*/
2016-04-05 15:00:03 -05:00
public function updateStartDate(string $range, Carbon $start): Carbon
2015-02-06 14:23:14 -06:00
{
$functionMap = [
2016-11-20 00:24:18 -06:00
'1D' => 'startOfDay',
'1W' => 'startOfWeek',
'1M' => 'startOfMonth',
'3M' => 'firstOfQuarter',
'1Y' => 'startOfYear',
'custom' => 'startOfMonth', // this only happens in test situations.
2015-02-06 14:23:14 -06:00
];
if (isset($functionMap[$range])) {
$function = $functionMap[$range];
$start->$function();
return $start;
}
2017-11-15 05:25:49 -06:00
if ('6M' === $range) {
2015-05-05 03:30:39 -05:00
if ($start->month >= 7) {
2015-02-06 14:23:14 -06:00
$start->startOfYear()->addMonths(6);
return $start;
2015-02-06 14:23:14 -06:00
}
$start->startOfYear();
2015-02-06 14:23:14 -06:00
return $start;
}
throw new FireflyException(sprintf('updateStartDate cannot handle range "%s"', $range));
2015-02-06 14:23:14 -06:00
}
2015-03-29 01:14:32 -05:00
}