2015-02-06 21:23:14 +01:00
< ? php
2016-05-20 12:41:23 +02:00
/**
* Navigation.php
2017-10-21 08:40:00 +02:00
* Copyright (c) 2017 thegrumpydictator@gmail.com
2016-05-20 12:41:23 +02:00
*
2017-10-21 08:40:00 +02:00
* This file is part of Firefly III.
2016-10-05 06:52:15 +02:00
*
2017-10-21 08:40:00 +02: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 14:44:05 +01:00
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
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 ;
2018-12-31 13:44:24 +01:00
use FireflyIII\Helpers\FiscalHelperInterface ;
2017-12-23 17:42:07 +01:00
use Log ;
2015-02-06 21:23:14 +01:00
/**
2017-11-15 12:25:49 +01:00
* Class Navigation.
2015-02-06 21:23:14 +01:00
*/
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
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-02-22 15:40:13 +01:00
*/
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 = [
2019-03-02 08:05:15 +01: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' ,
'year' => 'addYears' ,
'yearly' => 'addYears' ,
'1Y' => 'addYears' ,
'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 ])) {
2018-03-29 19:01:47 +02:00
$add *= $modifierMap [ $repeatFreq ];
2015-02-25 15:19:14 +01:00
}
$function = $functionMap [ $repeatFreq ];
$date -> $function ( $add );
2019-03-02 08:05:15 +01:00
// if period is 1M and diff in month is 2 and new DOM > 1, sub a number of days:
// result is:
// '2019-01-29', '2019-02-28'
// '2019-01-30', '2019-02-28'
// '2019-01-31', '2019-02-28'
2017-09-25 07:32:29 +02:00
$months = [ '1M' , 'month' , 'monthly' ];
$difference = $date -> month - $theDate -> month ;
2019-03-02 08:05:15 +01:00
if ( 2 === $difference && $date -> day > 0 && \in_array ( $repeatFreq , $months , true )) {
$date -> subDays ( $date -> day );
2017-09-25 07:32:29 +02:00
}
2015-02-25 15:19:14 +01:00
return $date ;
2015-02-22 15:40:13 +01:00
}
2018-01-14 10:48:17 +01:00
/**
* @param \Carbon\Carbon $start
* @param \Carbon\Carbon $end
* @param string $range
*
* @return array
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2018-07-28 10:45:16 +02:00
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
2018-01-14 10:48:17 +01:00
*/
public function blockPeriods ( \Carbon\Carbon $start , \Carbon\Carbon $end , string $range ) : array
{
2018-02-09 16:47:01 +01:00
if ( $end < $start ) {
2018-04-02 14:50:17 +02:00
[ $start , $end ] = [ $end , $start ];
2018-02-09 16:47:01 +01:00
}
2018-01-14 10:48:17 +01:00
$periods = [];
2018-02-09 16:47:01 +01:00
/*
2018-09-10 20:24:19 +02:00
* Start looping per month for 1 year + the rest of the year:
2018-02-09 16:47:01 +01:00
*/
2018-01-14 10:48:17 +01:00
$perMonthEnd = clone $end ;
$perMonthStart = clone $end ;
2018-03-29 19:01:47 +02:00
$perMonthStart -> startOfYear () -> subYear ();
2018-01-14 10:48:17 +01:00
$perMonthStart = $start -> lt ( $perMonthStart ) ? $perMonthStart : $start ;
// loop first set:
while ( $perMonthEnd >= $perMonthStart ) {
$perMonthEnd = $this -> startOfPeriod ( $perMonthEnd , $range );
$currentEnd = $this -> endOfPeriod ( $perMonthEnd , $range );
if ( $currentEnd -> gt ( $start )) {
$periods [] = [
'start' => $perMonthEnd ,
'end' => $currentEnd ,
'period' => $range ,
];
}
$perMonthEnd = $this -> subtractPeriod ( $perMonthEnd , $range , 1 );
}
// do not continue if date is already less
if ( $perMonthEnd -> lt ( $start )) {
return $periods ;
}
// per year variables:
$perYearEnd = clone $perMonthStart ;
$perYearStart = clone $perMonthStart ;
unset ( $perMonthEnd , $currentEnd , $perMonthStart );
$perYearEnd -> subYear ();
$perYearStart -> subYears ( 50 );
$perYearStart = $start -> lt ( $perYearStart ) ? $perYearStart : $start ;
$perYearStart -> startOfYear ();
// per year
while ( $perYearEnd >= $perYearStart ) {
$perYearEnd = $this -> startOfPeriod ( $perYearEnd , '1Y' );
2019-03-02 10:42:43 +01:00
$currentEnd = $this -> endOfPeriod ( $perYearEnd , '1Y' ) -> endOfDay ();
2018-01-14 10:48:17 +01:00
if ( $currentEnd -> gt ( $start )) {
$periods [] = [
'start' => $perYearEnd ,
'end' => $currentEnd ,
'period' => '1Y' ,
];
}
$perYearEnd = $this -> subtractPeriod ( $perYearEnd , '1Y' , 1 );
}
return $periods ;
}
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
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-02-25 15:19:14 +01:00
*/
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 = [
2019-03-02 08:05:15 +01:00
'1D' => 'endOfDay' ,
'daily' => 'endOfDay' ,
'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 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
];
2019-01-04 17:10:16 +01:00
$subDay = [ 'week' , 'weekly' , '1W' , 'month' , 'monthly' , '1M' , '3M' , 'quarter' , 'quarterly' , '6M' , 'half-year' , '1Y' , '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-11-15 12:25:49 +01:00
if ( 'custom' === $repeatFreq ) {
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 ;
}
2018-06-02 18:19:35 +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 endOfPeriod for $repeat_freq "%s"' , $repeatFreq ));
2015-02-25 15:19:14 +01:00
}
$function = $functionMap [ $repeatFreq ];
2018-06-02 18:19:35 +02:00
2015-02-25 15:19:14 +01:00
if ( isset ( $modifierMap [ $repeatFreq ])) {
$currentEnd -> $function ( $modifierMap [ $repeatFreq ]);
2018-07-27 05:03:37 +02:00
if ( \in_array ( $repeatFreq , $subDay , true )) {
2016-05-20 17:53:03 +02:00
$currentEnd -> subDay ();
}
2019-03-02 08:05:15 +01:00
$currentEnd -> endOfDay ();
2016-05-20 17:53:03 +02:00
return $currentEnd ;
2015-02-25 15:19:14 +01:00
}
2016-05-20 17:53:03 +02:00
$currentEnd -> $function ();
2019-03-02 08:05:15 +01:00
$currentEnd -> endOfDay ();
2018-07-27 05:03:37 +02:00
if ( \in_array ( $repeatFreq , $subDay , true )) {
2015-02-25 15:19:14 +01:00
$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
*
2018-02-06 07:50:19 +01:00
* @return \Carbon\Carbon
2015-02-27 11:02:08 +01:00
*/
2017-07-23 19:06:24 +02:00
public function endOfX ( Carbon $theCurrentEnd , string $repeatFreq , ? Carbon $maxDate ) : 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
2017-11-15 12:25:49 +01:00
if ( 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' ;
2018-01-25 18:41:27 +01:00
$format = $this -> preferredCarbonFormat ( $start , $end );
2018-04-02 14:50:17 +02:00
$displayFormat = ( string ) trans ( 'config.month_and_day' );
2016-11-19 13:37:44 +01:00
// increment by month (for year)
if ( $start -> diffInMonths ( $end ) > 1 ) {
$increment = 'addMonth' ;
2018-04-02 14:50:17 +02:00
$displayFormat = ( string ) trans ( 'config.month' );
2016-11-19 13:37:44 +01:00
}
// increment by year (for multi year)
if ( $start -> diffInMonths ( $end ) > 12 ) {
$increment = 'addYear' ;
2018-04-02 14:50:17 +02:00
$displayFormat = ( string ) trans ( 'config.year' );
2016-11-19 13:37:44 +01:00
}
$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
/**
2017-10-15 14:05:31 +02:00
* @param \Carbon\Carbon $theDate
2018-02-09 16:47:01 +01:00
* @param string $repeatFrequency
2015-02-25 15:19:14 +01:00
*
* @return string
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-02-25 15:19:14 +01:00
*/
2018-07-14 23:04:05 +02:00
public function periodShow ( \Carbon\Carbon $theDate , string $repeatFrequency ) : string
2015-02-25 15:19:14 +01:00
{
2017-11-01 15:34:08 +01:00
$date = clone $theDate ;
2015-02-25 15:19:14 +01:00
$formatMap = [
2018-07-15 09:38:49 +02:00
'1D' => ( string ) trans ( 'config.specific_day' ),
'daily' => ( string ) trans ( 'config.specific_day' ),
'custom' => ( string ) trans ( 'config.specific_day' ),
'1W' => ( string ) trans ( 'config.week_in_year' ),
'week' => ( string ) trans ( 'config.week_in_year' ),
'weekly' => ( string ) trans ( 'config.week_in_year' ),
'1M' => ( string ) trans ( 'config.month' ),
'month' => ( string ) trans ( 'config.month' ),
'monthly' => ( string ) trans ( 'config.month' ),
'1Y' => ( string ) trans ( 'config.year' ),
'year' => ( string ) trans ( 'config.year' ),
'yearly' => ( string ) trans ( 'config.year' ),
'6M' => ( string ) 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 ])) {
2018-04-02 14:50:17 +02:00
return $date -> formatLocalized (( string ) $formatMap [ $repeatFrequency ]);
2015-02-25 15:19:14 +01:00
}
2017-11-15 12:25:49 +01:00
if ( '3M' === $repeatFrequency || 'quarter' === $repeatFrequency ) {
2017-11-01 15:34:08 +01:00
$quarter = ceil ( $theDate -> month / 3 );
return sprintf ( 'Q%d %d' , $quarter , $theDate -> year );
}
// special formatter for quarter of year
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
{
2018-04-02 14:50:17 +02:00
$format = ( string ) trans ( 'config.month_and_day' );
2016-11-26 08:41:15 +01:00
if ( $start -> diffInMonths ( $end ) > 1 ) {
2018-04-02 14:50:17 +02:00
$format = ( string ) trans ( 'config.month' );
2016-11-26 08:41:15 +01:00
}
if ( $start -> diffInMonths ( $end ) > 12 ) {
2018-04-02 14:50:17 +02:00
$format = ( string ) 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
* 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
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-02-25 15:19:14 +01:00
*/
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-11-15 12:25:49 +01:00
if ( 'half-year' === $repeatFreq || '6M' === $repeatFreq ) {
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 ;
}
2018-01-14 10:48:17 +01:00
2017-11-15 12:25:49 +01:00
if ( 'custom' === $repeatFreq ) {
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
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-03-29 21:27:51 +02:00
*/
2018-07-15 10:00:08 +02:00
public function subtractPeriod ( Carbon $theDate , string $repeatFreq , int $subtract = null ) : Carbon
2015-03-29 21:27:51 +02:00
{
2018-07-15 10:00:08 +02:00
$subtract = $subtract ? ? 1 ;
$date = clone $theDate ;
2015-09-25 17:28:42 +02:00
// 1D 1W 1M 3M 6M 1Y
2018-07-13 06:52:53 +02:00
Log :: debug ( sprintf ( 'subtractPeriod: date is %s, repeat frequency is %s and subtract is %d' , $date -> format ( 'Y-m-d' ), $repeatFreq , $subtract ));
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 );
2017-12-23 17:42:07 +01: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 21:27:51 +02:00
return $date ;
}
if ( isset ( $modifierMap [ $repeatFreq ])) {
2018-03-29 19:01:47 +02:00
$subtract *= $modifierMap [ $repeatFreq ];
2015-03-29 21:27:51 +02:00
$date -> subMonths ( $subtract );
2017-12-23 17:42:07 +01: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' )));
2017-12-29 09:05:35 +01:00
2015-03-29 21:27:51 +02:00
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).
2017-11-15 12:25:49 +01:00
if ( 'custom' === $repeatFreq ) {
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 );
2017-12-23 17:42:07 +01: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 ));
2016-02-05 07:21:51 +01:00
$date -> subDays ( $diffInDays * $subtract );
2017-12-23 17:42:07 +01:00
Log :: debug ( sprintf ( 'subtractPeriod: resulting date is %s' , $date -> format ( 'Y-m-d' )));
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
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-02-11 07:35:10 +01:00
*/
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' ,
'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-11-15 12:25:49 +01:00
if ( '6M' === $range ) {
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 ;
}
2018-12-31 13:44:24 +01:00
// make sure 1Y takes the fiscal year into account.
if ( '1Y' === $range ) {
/** @var FiscalHelperInterface $fiscalHelper */
$fiscalHelper = app ( FiscalHelperInterface :: class );
2019-01-04 17:10:16 +01:00
2018-12-31 13:44:24 +01:00
return $fiscalHelper -> endOfFiscalYear ( $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
2017-11-15 12:25:49 +01:00
*
2018-02-06 07:50:19 +01:00
* @throws \FireflyIII\Exceptions\FireflyException
2015-02-11 07:35:10 +01:00
*/
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' ,
'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-11-15 12:25:49 +01:00
if ( '6M' === $range ) {
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 ;
}
2018-12-31 13:44:24 +01:00
// make sure 1Y takes the fiscal year into account.
if ( '1Y' === $range ) {
/** @var FiscalHelperInterface $fiscalHelper */
$fiscalHelper = app ( FiscalHelperInterface :: class );
2019-01-04 17:10:16 +01:00
2018-12-31 13:44:24 +01:00
return $fiscalHelper -> startOfFiscalYear ( $start );
}
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
}