2015-02-06 21:23:14 +01:00
< ? php
2016-05-20 12:41:23 +02:00
/**
* Navigation.php
* Copyright (C) 2016 thegrumpydictator@gmail.com
*
2016-10-05 06:52:15 +02:00
* This software may be modified and distributed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International License.
*
* See the LICENSE file for details.
2016-05-20 12:41:23 +02:00
*/
2017-04-09 07:44:22 +02:00
declare ( strict_types = 1 );
2015-02-06 21:23:14 +01:00
namespace FireflyIII\Support ;
use Carbon\Carbon ;
2015-02-22 09:46:21 +01:00
use FireflyIII\Exceptions\FireflyException ;
2015-02-06 21:23:14 +01:00
/**
* Class Navigation
*
* @package FireflyIII\Support
*/
class Navigation
{
2015-02-22 15:40:13 +01:00
/**
2015-05-05 10:23:01 +02:00
* @param \Carbon\Carbon $theDate
2015-02-25 15:19:14 +01:00
* @param $repeatFreq
* @param $skip
2015-02-22 15:40:13 +01:00
*
2015-02-25 15:19:14 +01:00
* @return \Carbon\Carbon
2015-02-22 15:40:13 +01:00
* @throws FireflyException
*/
2016-04-05 22:00:03 +02:00
public function addPeriod ( Carbon $theDate , string $repeatFreq , int $skip ) : Carbon
2015-02-22 15:40:13 +01:00
{
2015-02-25 15:19:14 +01:00
$date = clone $theDate ;
$add = ( $skip + 1 );
2015-02-22 15:40:13 +01:00
2015-02-25 15:19:14 +01:00
$functionMap = [
2015-05-17 09:35:49 +02: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 21:51:46 +02:00
'year' => 'addYears' , 'yearly' => 'addYears' , '1Y' => 'addYears' ,
2016-12-10 07:29:36 +01:00
'custom' => 'addMonths' , // custom? just add one month.
2015-02-22 15:40:13 +01:00
];
2015-02-25 15:19:14 +01:00
$modifierMap = [
'quarter' => 3 ,
2015-03-04 09:42:47 +01:00
'3M' => 3 ,
2015-02-25 15:19:14 +01:00
'quarterly' => 3 ,
2015-03-04 09:42:47 +01:00
'6M' => 6 ,
2015-02-25 15:19:14 +01:00
'half-year' => 6 ,
];
2015-06-06 23:09:12 +02:00
2015-02-25 15:19:14 +01:00
if ( ! isset ( $functionMap [ $repeatFreq ])) {
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'Cannot do addPeriod for $repeat_freq "%s"' , $repeatFreq ));
2015-02-22 15:40:13 +01:00
}
2015-02-25 15:19:14 +01:00
if ( isset ( $modifierMap [ $repeatFreq ])) {
$add = $add * $modifierMap [ $repeatFreq ];
}
$function = $functionMap [ $repeatFreq ];
$date -> $function ( $add );
return $date ;
2015-02-22 15:40:13 +01:00
}
2015-02-25 15:19:14 +01:00
/**
2016-04-24 20:23:17 +02:00
* @param \Carbon\Carbon $end
2015-02-25 15:19:14 +01:00
* @param $repeatFreq
*
2015-05-05 10:23:01 +02:00
* @return \Carbon\Carbon
2015-02-25 15:19:14 +01:00
* @throws FireflyException
*/
2017-03-11 07:41:26 +01:00
public function endOfPeriod ( \Carbon\Carbon $end , string $repeatFreq ) : Carbon
2015-02-25 15:19:14 +01:00
{
2016-04-24 20:23:17 +02:00
$currentEnd = clone $end ;
2015-02-25 15:19:14 +01:00
$functionMap = [
2016-04-24 20:23:17 +02:00
'1D' => 'endOfDay' , 'daily' => 'endOfDay' ,
2015-05-17 10:30:18 +02:00
'1W' => 'addWeek' , 'week' => 'addWeek' , 'weekly' => 'addWeek' ,
'1M' => 'addMonth' , 'month' => 'addMonth' , 'monthly' => 'addMonth' ,
'3M' => 'addMonths' , 'quarter' => 'addMonths' , 'quarterly' => 'addMonths' , '6M' => 'addMonths' , 'half-year' => 'addMonths' ,
2016-02-05 06:56:10 +01:00
'year' => 'addYear' , 'yearly' => 'addYear' , '1Y' => 'addYear' ,
2015-02-25 15:19:14 +01:00
];
$modifierMap = [
'quarter' => 3 ,
2015-03-04 09:42:47 +01:00
'3M' => 3 ,
2015-02-25 15:19:14 +01:00
'quarterly' => 3 ,
'half-year' => 6 ,
2015-03-04 09:42:47 +01:00
'6M' => 6 ,
2015-02-25 15:19:14 +01:00
];
2015-03-04 09:42:47 +01:00
$subDay = [ 'week' , 'weekly' , '1W' , 'month' , 'monthly' , '1M' , '3M' , 'quarter' , 'quarterly' , '6M' , 'half-year' , 'year' , 'yearly' ];
2015-02-25 15:19:14 +01:00
2016-02-05 07:16:55 +01: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-07-15 16:41:07 +02:00
if ( $repeatFreq === 'custom' ) {
2016-02-05 07:16:55 +01: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 15:19:14 +01:00
if ( ! isset ( $functionMap [ $repeatFreq ])) {
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'Cannot do endOfPeriod for $repeat_freq "%s"' , $repeatFreq ));
2015-02-25 15:19:14 +01:00
}
$function = $functionMap [ $repeatFreq ];
if ( isset ( $modifierMap [ $repeatFreq ])) {
$currentEnd -> $function ( $modifierMap [ $repeatFreq ]);
2016-05-20 17:53:03 +02:00
if ( in_array ( $repeatFreq , $subDay )) {
$currentEnd -> subDay ();
}
return $currentEnd ;
2015-02-25 15:19:14 +01:00
}
2016-05-20 17:53:03 +02:00
$currentEnd -> $function ();
2015-02-25 15:19:14 +01:00
if ( in_array ( $repeatFreq , $subDay )) {
$currentEnd -> subDay ();
}
return $currentEnd ;
}
2015-02-22 15:40:13 +01:00
2015-02-27 11:02:08 +01:00
/**
2017-01-05 10:06:46 +01:00
* @param \Carbon\Carbon $theCurrentEnd
* @param string $repeatFreq
* @param \Carbon\Carbon|null $maxDate
2015-02-27 11:02:08 +01:00
*
2017-01-05 10:06:46 +01:00
* @return Carbon
2015-02-27 11:02:08 +01:00
*/
2016-04-05 22:00:03 +02:00
public function endOfX ( Carbon $theCurrentEnd , string $repeatFreq , Carbon $maxDate = null ) : Carbon
2015-02-27 11:02:08 +01:00
{
$functionMap = [
2015-09-25 17:28:42 +02:00
'1D' => 'endOfDay' ,
2015-02-27 11:02:08 +01:00
'daily' => 'endOfDay' ,
2015-09-25 17:28:42 +02:00
'1W' => 'endOfWeek' ,
2015-02-27 11:02:08 +01:00
'week' => 'endOfWeek' ,
'weekly' => 'endOfWeek' ,
'month' => 'endOfMonth' ,
2015-09-25 16:00:14 +02:00
'1M' => 'endOfMonth' ,
2015-02-27 11:02:08 +01:00
'monthly' => 'endOfMonth' ,
2015-09-25 17:28:42 +02:00
'3M' => 'lastOfQuarter' ,
2015-02-27 11:02:08 +01:00
'quarter' => 'lastOfQuarter' ,
'quarterly' => 'lastOfQuarter' ,
2015-09-25 17:28:42 +02:00
'1Y' => 'endOfYear' ,
2015-02-27 11:02:08 +01:00
'year' => 'endOfYear' ,
'yearly' => 'endOfYear' ,
];
$currentEnd = clone $theCurrentEnd ;
if ( isset ( $functionMap [ $repeatFreq ])) {
$function = $functionMap [ $repeatFreq ];
$currentEnd -> $function ();
}
2015-06-29 09:14:39 +02:00
2015-09-25 16:00:14 +02:00
if ( ! is_null ( $maxDate ) && $currentEnd > $maxDate ) {
2015-02-27 11:02:08 +01:00
return clone $maxDate ;
}
return $currentEnd ;
}
2016-11-19 13:37:44 +01: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 08:41:15 +01:00
$format = self :: preferredCarbonFormat ( $start , $end );
2016-11-19 13:37:44 +01: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 15:19:14 +01:00
/**
2015-06-27 08:06:24 +02:00
* @param \Carbon\Carbon $date
2015-02-25 15:19:14 +01:00
* @param $repeatFrequency
*
* @return string
* @throws FireflyException
*/
2016-04-05 22:00:03 +02:00
public function periodShow ( Carbon $date , string $repeatFrequency ) : string
2015-02-25 15:19:14 +01:00
{
$formatMap = [
2016-02-07 08:40:59 +01:00
'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' ),
'3M' => trans ( 'config.quarter_of_year' ),
'quarter' => trans ( 'config.quarter_of_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 15:19:14 +01:00
];
2015-05-25 21:17:36 +02:00
2015-02-25 15:19:14 +01:00
if ( isset ( $formatMap [ $repeatFrequency ])) {
2016-02-10 16:23:37 +01:00
return $date -> formatLocalized ( strval ( $formatMap [ $repeatFrequency ]));
2015-02-25 15:19:14 +01:00
}
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'No date formats for frequency "%s"!' , $repeatFrequency ));
2015-02-25 15:19:14 +01:00
}
2016-12-15 13:47:28 +01:00
/**
2016-12-30 13:47:23 +01: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 13:47:28 +01:00
*
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
*
* @return string
*/
2016-12-30 13:47:23 +01:00
public function preferredCarbonFormat ( Carbon $start , Carbon $end ) : string
2016-12-15 13:47:28 +01:00
{
2016-12-30 13:47:23 +01:00
$format = 'Y-m-d' ;
2016-12-15 13:47:28 +01:00
if ( $start -> diffInMonths ( $end ) > 1 ) {
2016-12-30 13:47:23 +01:00
$format = 'Y-m' ;
2016-12-15 13:47:28 +01:00
}
if ( $start -> diffInMonths ( $end ) > 12 ) {
2016-12-30 13:47:23 +01:00
$format = 'Y' ;
2016-12-15 13:47:28 +01:00
}
2016-12-30 13:47:23 +01:00
2016-12-15 13:47:28 +01:00
return $format ;
}
2016-11-26 08:41:15 +01:00
/**
2016-12-30 13:47:23 +01: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 08:41:15 +01:00
*
2016-12-03 20:38:13 +01:00
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
2016-11-26 08:41:15 +01:00
*
* @return string
*/
2016-12-30 13:47:23 +01:00
public function preferredCarbonLocalizedFormat ( Carbon $start , Carbon $end ) : string
2016-11-26 08:41:15 +01:00
{
2016-12-30 13:47:23 +01:00
$format = strval ( trans ( 'config.month_and_day' ));
2016-11-26 08:41:15 +01:00
if ( $start -> diffInMonths ( $end ) > 1 ) {
2016-12-30 13:47:23 +01:00
$format = strval ( trans ( 'config.month' ));
2016-11-26 08:41:15 +01:00
}
if ( $start -> diffInMonths ( $end ) > 12 ) {
2016-12-30 13:47:23 +01:00
$format = strval ( trans ( 'config.year' ));
2016-11-26 08:41:15 +01:00
}
2016-12-30 13:47:23 +01:00
2016-12-15 13:47:28 +01:00
return $format ;
2016-12-30 13:47:23 +01:00
2016-12-15 13:47:28 +01:00
}
/**
2016-12-30 13:47:23 +01: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 13:47:28 +01:00
*
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
*
* @return string
*/
2016-12-30 13:47:23 +01:00
public function preferredEndOfPeriod ( Carbon $start , Carbon $end ) : string
2016-12-15 13:47:28 +01:00
{
2016-12-30 13:47:23 +01:00
$format = 'endOfDay' ;
2016-12-15 13:47:28 +01:00
if ( $start -> diffInMonths ( $end ) > 1 ) {
2016-12-30 13:47:23 +01:00
$format = 'endOfMonth' ;
2016-12-15 13:47:28 +01:00
}
if ( $start -> diffInMonths ( $end ) > 12 ) {
2016-12-30 13:47:23 +01:00
$format = 'endOfYear' ;
2016-12-15 13:47:28 +01:00
}
2016-11-26 08:41:15 +01: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 20:38:13 +01:00
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
2016-11-26 08:41:15 +01: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 15:19:14 +01:00
/**
2015-05-05 10:23:01 +02:00
* @param \Carbon\Carbon $theDate
2015-02-25 15:19:14 +01:00
* @param $repeatFreq
*
2015-05-05 10:23:01 +02:00
* @return \Carbon\Carbon
2015-02-25 15:19:14 +01:00
* @throws FireflyException
*/
2016-04-05 22:00:03 +02:00
public function startOfPeriod ( Carbon $theDate , string $repeatFreq ) : Carbon
2015-02-25 15:19:14 +01:00
{
$date = clone $theDate ;
$functionMap = [
2015-03-04 09:42:47 +01:00
'1D' => 'startOfDay' ,
2015-03-03 17:40:17 +01:00
'daily' => 'startOfDay' ,
2015-03-04 09:42:47 +01:00
'1W' => 'startOfWeek' ,
2015-03-03 17:40:17 +01:00
'week' => 'startOfWeek' ,
'weekly' => 'startOfWeek' ,
'month' => 'startOfMonth' ,
2015-03-04 09:42:47 +01:00
'1M' => 'startOfMonth' ,
2015-03-03 17:40:17 +01:00
'monthly' => 'startOfMonth' ,
2015-03-04 09:42:47 +01:00
'3M' => 'firstOfQuarter' ,
2015-03-03 17:40:17 +01:00
'quarter' => 'firstOfQuarter' ,
'quarterly' => 'firstOfQuarter' ,
'year' => 'startOfYear' ,
'yearly' => 'startOfYear' ,
2016-02-05 06:56:10 +01:00
'1Y' => 'startOfYear' ,
2015-02-25 15:19:14 +01:00
];
if ( isset ( $functionMap [ $repeatFreq ])) {
$function = $functionMap [ $repeatFreq ];
$date -> $function ();
return $date ;
}
2017-07-15 16:41:07 +02:00
if ( $repeatFreq === 'half-year' || $repeatFreq === '6M' ) {
2015-05-05 10:30:39 +02:00
$month = $date -> month ;
2015-02-25 15:19:14 +01:00
$date -> startOfYear ();
if ( $month >= 7 ) {
$date -> addMonths ( 6 );
}
return $date ;
}
2016-02-05 06:56:10 +01:00
if ( $repeatFreq === 'custom' ) {
2016-02-05 07:21:51 +01:00
return $date ; // the date is already at the start.
2016-02-05 06:56:10 +01:00
}
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'Cannot do startOfPeriod for $repeat_freq "%s"' , $repeatFreq ));
2015-02-25 15:19:14 +01:00
}
2015-03-29 21:27:51 +02:00
/**
2015-12-31 17:20:54 +01:00
* @param \Carbon\Carbon $theDate
2015-03-29 21:27:51 +02:00
* @param $repeatFreq
* @param int $subtract
*
2015-12-31 17:20:54 +01:00
* @return \Carbon\Carbon
2015-03-29 21:27:51 +02:00
* @throws FireflyException
*/
2016-04-05 22:00:03 +02:00
public function subtractPeriod ( Carbon $theDate , string $repeatFreq , int $subtract = 1 ) : Carbon
2015-03-29 21:27:51 +02:00
{
$date = clone $theDate ;
2015-09-25 17:28:42 +02:00
// 1D 1W 1M 3M 6M 1Y
2015-03-29 21:27:51 +02:00
$functionMap = [
2015-09-25 17:28:42 +02:00
'1D' => 'subDays' ,
2015-03-29 21:27:51 +02:00
'daily' => 'subDays' ,
'week' => 'subWeeks' ,
2015-09-25 17:28:42 +02:00
'1W' => 'subWeeks' ,
2015-03-29 21:27:51 +02:00
'weekly' => 'subWeeks' ,
'month' => 'subMonths' ,
2015-09-25 16:00:14 +02:00
'1M' => 'subMonths' ,
2015-03-29 21:27:51 +02:00
'monthly' => 'subMonths' ,
'year' => 'subYears' ,
2016-02-05 06:56:10 +01:00
'1Y' => 'subYears' ,
2015-03-29 21:27:51 +02:00
'yearly' => 'subYears' ,
];
$modifierMap = [
'quarter' => 3 ,
2016-02-05 06:56:10 +01:00
'3M' => 3 ,
2015-03-29 21:27:51 +02:00
'quarterly' => 3 ,
'half-year' => 6 ,
2016-02-05 06:56:10 +01:00
'6M' => 6 ,
2015-03-29 21:27:51 +02:00
];
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 ;
}
2016-02-05 07:21:51 +01:00
// a custom range requires the session start
// and session end to calculate the difference in days.
// this is then subtracted from $theDate (* $subtract).
2016-02-05 09:30:06 +01:00
if ( $repeatFreq === 'custom' ) {
2016-02-05 07:21:51 +01:00
/** @var Carbon $tStart */
$tStart = session ( 'start' , Carbon :: now () -> startOfMonth ());
/** @var Carbon $tEnd */
$tEnd = session ( 'end' , Carbon :: now () -> endOfMonth ());
$diffInDays = $tStart -> diffInDays ( $tEnd );
$date -> subDays ( $diffInDays * $subtract );
2016-02-05 09:30:06 +01:00
2016-02-05 07:21:51 +01:00
return $date ;
}
2015-03-29 21:27:51 +02:00
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'Cannot do subtractPeriod for $repeat_freq "%s"' , $repeatFreq ));
2015-03-29 21:27:51 +02:00
}
2015-02-11 07:35:10 +01:00
/**
2015-05-05 12:57:27 +02:00
* @param $range
2015-05-05 10:23:01 +02:00
* @param \Carbon\Carbon $start
2015-02-11 07:35:10 +01:00
*
2015-05-05 10:23:01 +02:00
* @return \Carbon\Carbon
2015-02-11 07:35:10 +01:00
* @throws FireflyException
*/
2016-04-05 22:00:03 +02:00
public function updateEndDate ( string $range , Carbon $start ) : Carbon
2015-02-06 21:23:14 +01:00
{
$functionMap = [
2016-11-20 07:24:18 +01:00
'1D' => 'endOfDay' ,
'1W' => 'endOfWeek' ,
'1M' => 'endOfMonth' ,
'3M' => 'lastOfQuarter' ,
'1Y' => 'endOfYear' ,
'custom' => 'startOfMonth' , // this only happens in test situations.
2015-02-06 21:23:14 +01:00
];
2015-06-05 16:49:16 +02:00
$end = clone $start ;
2015-02-06 21:23:14 +01:00
if ( isset ( $functionMap [ $range ])) {
$function = $functionMap [ $range ];
$end -> $function ();
return $end ;
}
2017-07-15 16:41:07 +02:00
if ( $range === '6M' ) {
2015-05-05 10:30:39 +02:00
if ( $start -> month >= 7 ) {
2015-02-06 21:23:14 +01:00
$end -> endOfYear ();
2016-05-20 17:58:10 +02:00
return $end ;
2015-02-06 21:23:14 +01:00
}
2016-05-20 17:58:10 +02:00
$end -> startOfYear () -> addMonths ( 6 );
2015-02-06 21:23:14 +01:00
return $end ;
}
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'updateEndDate cannot handle range "%s"' , $range ));
2015-02-06 21:23:14 +01:00
}
2015-02-11 07:35:10 +01:00
/**
2015-05-05 10:23:01 +02:00
* @param $range
* @param \Carbon\Carbon $start
2015-02-11 07:35:10 +01:00
*
2015-05-05 10:23:01 +02:00
* @return \Carbon\Carbon
2015-02-11 07:35:10 +01:00
* @throws FireflyException
*/
2016-04-05 22:00:03 +02:00
public function updateStartDate ( string $range , Carbon $start ) : Carbon
2015-02-06 21:23:14 +01:00
{
$functionMap = [
2016-11-20 07:24:18 +01:00
'1D' => 'startOfDay' ,
'1W' => 'startOfWeek' ,
'1M' => 'startOfMonth' ,
'3M' => 'firstOfQuarter' ,
'1Y' => 'startOfYear' ,
'custom' => 'startOfMonth' , // this only happens in test situations.
2015-02-06 21:23:14 +01:00
];
if ( isset ( $functionMap [ $range ])) {
$function = $functionMap [ $range ];
$start -> $function ();
return $start ;
}
2017-07-15 16:41:07 +02:00
if ( $range === '6M' ) {
2015-05-05 10:30:39 +02:00
if ( $start -> month >= 7 ) {
2015-02-06 21:23:14 +01:00
$start -> startOfYear () -> addMonths ( 6 );
2016-05-20 17:53:03 +02:00
return $start ;
2015-02-06 21:23:14 +01:00
}
2016-05-20 17:53:03 +02:00
$start -> startOfYear ();
2015-02-06 21:23:14 +01:00
return $start ;
2016-05-20 17:53:03 +02:00
2015-02-06 21:23:14 +01:00
}
2016-11-03 21:54:07 +01:00
throw new FireflyException ( sprintf ( 'updateStartDate cannot handle range "%s"' , $range ));
2015-02-06 21:23:14 +01:00
}
2015-03-29 08:14:32 +02:00
}