| 
									
										
										
										
											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 = [ | 
					
						
							| 
									
										
										
										
											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])) { | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-25 07:32:29 +02: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; | 
					
						
							| 
									
										
										
										
											2018-07-27 05:03:37 +02:00
										 |  |  |         if (2 === $difference && 1 === $date->day && \in_array($repeatFreq, $months, true)) { | 
					
						
							| 
									
										
										
										
											2017-09-25 07:32:29 +02:00
										 |  |  |             $date->subDay(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'); | 
					
						
							|  |  |  |             $currentEnd = $this->endOfPeriod($perYearEnd, '1Y')->subDay()->endOfDay(); | 
					
						
							|  |  |  |             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 = [ | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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]); | 
					
						
							| 
									
										
										
										
											2016-05-20 17:53:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-27 05:03:37 +02:00
										 |  |  |             if (\in_array($repeatFreq, $subDay, true)) { | 
					
						
							| 
									
										
										
										
											2016-05-20 17:53:03 +02:00
										 |  |  |                 $currentEnd->subDay(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return $currentEnd; | 
					
						
							| 
									
										
										
										
											2015-02-25 15:19:14 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-05-20 17:53:03 +02:00
										 |  |  |         $currentEnd->$function(); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |