firefly-iii/app/Support/Navigation.php

460 lines
13 KiB
PHP
Raw Normal View History

2015-02-06 14:23:14 -06:00
<?php
namespace FireflyIII\Support;
use Carbon\Carbon;
2015-02-22 02:46:21 -06:00
use FireflyIII\Exceptions\FireflyException;
2015-02-06 14:23:14 -06:00
/**
* Class Navigation
*
* @package FireflyIII\Support
*/
class Navigation
{
2015-02-22 08:40:13 -06:00
/**
2015-02-25 08:19:14 -06:00
* @param Carbon $theDate
* @param $repeatFreq
* @param $skip
2015-02-22 08:40:13 -06:00
*
2015-02-25 08:19:14 -06:00
* @return \Carbon\Carbon
2015-02-22 08:40:13 -06:00
* @throws FireflyException
*/
2015-02-25 08:19:14 -06:00
public function addPeriod(Carbon $theDate, $repeatFreq, $skip)
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-03-04 02:42:47 -06:00
'1D' => 'addDays',
2015-02-25 08:19:14 -06:00
'daily' => 'addDays',
2015-03-04 02:42:47 -06:00
'1W' => 'addWeeks',
2015-02-25 08:19:14 -06:00
'weekly' => 'addWeeks',
'week' => 'addWeeks',
2015-03-04 02:42:47 -06:00
'1M' => 'addMonths',
2015-02-25 08:19:14 -06:00
'month' => 'addMonths',
'monthly' => 'addMonths',
2015-03-04 02:42:47 -06:00
'3M' => 'addMonths',
2015-02-25 08:19:14 -06:00
'quarter' => 'addMonths',
'quarterly' => 'addMonths',
2015-03-04 02:42:47 -06:00
'6M' => 'addMonths',
2015-02-25 08:19:14 -06:00
'half-year' => 'addMonths',
'year' => 'addYears',
'yearly' => 'addYears',
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,
];
if (!isset($functionMap[$repeatFreq])) {
throw new FireflyException('Cannot do addPeriod for $repeat_freq "' . $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);
return $date;
2015-02-22 08:40:13 -06:00
}
2015-02-25 08:19:14 -06:00
/**
* @param Carbon $theCurrentEnd
* @param $repeatFreq
*
* @return Carbon
* @throws FireflyException
*/
public function endOfPeriod(Carbon $theCurrentEnd, $repeatFreq)
{
$currentEnd = clone $theCurrentEnd;
$functionMap = [
2015-03-04 02:42:47 -06:00
'1D' => 'addDay',
2015-02-25 08:19:14 -06:00
'daily' => 'addDay',
2015-03-04 02:42:47 -06:00
'1W' => 'addWeek',
2015-02-25 08:19:14 -06:00
'week' => 'addWeek',
'weekly' => 'addWeek',
2015-03-04 02:42:47 -06:00
'1M' => 'addMonth',
2015-02-25 08:19:14 -06:00
'month' => 'addMonth',
'monthly' => 'addMonth',
2015-03-04 02:42:47 -06:00
'3M' => 'addMonths',
2015-02-25 08:19:14 -06:00
'quarter' => 'addMonths',
'quarterly' => 'addMonths',
2015-03-04 02:42:47 -06:00
'6M' => 'addMonths',
2015-02-25 08:19:14 -06:00
'half-year' => 'addMonths',
'year' => 'addYear',
'yearly' => 'addYear',
];
$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
if (!isset($functionMap[$repeatFreq])) {
throw new FireflyException('Cannot do endOfPeriod for $repeat_freq ' . $repeatFreq);
}
$function = $functionMap[$repeatFreq];
if (isset($modifierMap[$repeatFreq])) {
$currentEnd->$function($modifierMap[$repeatFreq]);
} else {
$currentEnd->$function();
}
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
/**
*
* @param Carbon $theCurrentEnd
* @param $repeatFreq
* @param Carbon $maxDate
*
* @return Carbon
*/
public function endOfX(Carbon $theCurrentEnd, $repeatFreq, Carbon $maxDate)
{
$functionMap = [
'daily' => 'endOfDay',
'week' => 'endOfWeek',
'weekly' => 'endOfWeek',
'month' => 'endOfMonth',
'monthly' => 'endOfMonth',
'quarter' => 'lastOfQuarter',
'quarterly' => 'lastOfQuarter',
'year' => 'endOfYear',
'yearly' => 'endOfYear',
];
$specials = ['mont', 'monthly'];
$currentEnd = clone $theCurrentEnd;
if (isset($functionMap[$repeatFreq])) {
$function = $functionMap[$repeatFreq];
$currentEnd->$function();
}
if (isset($specials[$repeatFreq])) {
$month = intval($theCurrentEnd->format('m'));
$currentEnd->endOfYear();
if ($month <= 6) {
$currentEnd->subMonths(6);
}
}
if ($currentEnd > $maxDate) {
return clone $maxDate;
}
return $currentEnd;
}
2015-02-11 00:35:10 -06:00
/**
* @param $range
* @param Carbon $date
*
* @return Carbon
* @throws FireflyException
*/
2015-02-06 14:23:14 -06:00
public function jumpToNext($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;
}
2015-02-11 00:35:10 -06:00
/**
* @param $range
* @param Carbon $date
*
* @return Carbon
* @throws FireflyException
*/
2015-02-06 23:49:24 -06:00
public function jumpToPrevious($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);
}
2015-02-11 00:35:10 -06:00
/**
* @param $range
* @param Carbon $date
*
* @return string
* @throws FireflyException
*/
2015-02-06 14:23:14 -06:00
public 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('Y');
}
throw new FireflyException('No _periodName() for range "' . $range . '"');
}
2015-02-25 08:19:14 -06:00
/**
* @param Carbon $date
* @param $repeatFrequency
*
* @return string
* @throws FireflyException
*/
public function periodShow(Carbon $date, $repeatFrequency)
{
$formatMap = [
'daily' => 'j F Y',
'week' => '\W\e\e\k W, Y',
'weekly' => '\W\e\e\k W, Y',
'quarter' => 'F Y',
'month' => 'F Y',
'monthly' => 'F Y',
'year' => 'Y',
'yearly' => 'Y',
];
if (isset($formatMap[$repeatFrequency])) {
return $date->format($formatMap[$repeatFrequency]);
}
throw new FireflyException('No date formats for frequency "' . $repeatFrequency . '"!');
}
/**
* @param Carbon $theDate
* @param $repeatFreq
*
* @return Carbon
* @throws FireflyException
*/
public function startOfPeriod(Carbon $theDate, $repeatFreq)
{
$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',
2015-02-25 08:19:14 -06:00
];
if (isset($functionMap[$repeatFreq])) {
$function = $functionMap[$repeatFreq];
$date->$function();
return $date;
}
2015-03-04 02:42:47 -06:00
if ($repeatFreq == 'half-year' || $repeatFreq == '6M') {
2015-02-25 08:19:14 -06:00
$month = intval($date->format('m'));
$date->startOfYear();
if ($month >= 7) {
$date->addMonths(6);
}
return $date;
}
throw new FireflyException('Cannot do startOfPeriod for $repeat_freq ' . $repeatFreq);
}
2015-02-11 00:35:10 -06:00
/**
* @param $range
* @param Carbon $start
*
* @return Carbon
* @throws FireflyException
*/
2015-02-06 14:23:14 -06:00
public 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);
}
2015-02-11 00:35:10 -06:00
/**
* @param $range
* @param Carbon $start
*
* @return Carbon
* @throws FireflyException
*/
2015-02-06 14:23:14 -06:00
public 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 Carbon $theDate
* @param $repeatFreq
* @param int $subtract
*
* @return Carbon
* @throws FireflyException
*/
public function subtractPeriod(Carbon $theDate, $repeatFreq, $subtract = 1)
{
$date = clone $theDate;
$functionMap = [
'daily' => 'subDays',
'week' => 'subWeeks',
'weekly' => 'subWeeks',
'month' => 'subMonths',
'monthly' => 'subMonths',
'year' => 'subYears',
'yearly' => 'subYears',
];
$modifierMap = [
'quarter' => 3,
'quarterly' => 3,
'half-year' => 6,
];
if (isset($functionMap[$repeatFreq])) {
$function = $functionMap[$repeatFreq];
$date->$function($subtract);
return $date;
}
if (isset($modifierMap[$repeatFreq])) {
$subtract = $subtract * $modifierMap[$repeatFreq];
$date->subMonths($subtract);
return $date;
}
throw new FireflyException('Cannot do subtractPeriod for $repeat_freq ' . $repeatFreq);
}
2015-02-06 14:23:14 -06:00
}