'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', ]; $modifierMap = [ 'quarter' => 3, '3M' => 3, 'quarterly' => 3, '6M' => 6, 'half-year' => 6, ]; if (!isset($functionMap[$repeatFreq])) { throw new FireflyException('Cannot do addPeriod for $repeat_freq "' . $repeatFreq . '"'); } if (isset($modifierMap[$repeatFreq])) { $add = $add * $modifierMap[$repeatFreq]; } $function = $functionMap[$repeatFreq]; $date->$function($add); return $date; } /** * @param \Carbon\Carbon $theCurrentEnd * @param $repeatFreq * * @return \Carbon\Carbon * @throws FireflyException */ public function endOfPeriod(Carbon $theCurrentEnd, $repeatFreq) { $currentEnd = clone $theCurrentEnd; $functionMap = [ '1D' => 'addDay', 'daily' => 'addDay', '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', ]; $modifierMap = [ 'quarter' => 3, '3M' => 3, 'quarterly' => 3, 'half-year' => 6, '6M' => 6, ]; $subDay = ['week', 'weekly', '1W', 'month', 'monthly', '1M', '3M', 'quarter', 'quarterly', '6M', 'half-year', 'year', 'yearly']; if (!isset($functionMap[$repeatFreq])) { throw new FireflyException('Cannot do endOfPeriod for $repeat_freq "' . $repeatFreq . '"'); } $function = $functionMap[$repeatFreq]; if (isset($modifierMap[$repeatFreq])) { $currentEnd->$function($modifierMap[$repeatFreq]); } else { $currentEnd->$function(); } if (in_array($repeatFreq, $subDay)) { $currentEnd->subDay(); } return $currentEnd; } /** * * @param \Carbon\Carbon $theCurrentEnd * @param $repeatFreq * @param \Carbon\Carbon $maxDate * * @return \Carbon\Carbon */ public function endOfX(Carbon $theCurrentEnd, $repeatFreq, Carbon $maxDate = null) { $functionMap = [ '1D' => 'endOfDay', 'daily' => 'endOfDay', '1W' => 'endOfWeek', 'week' => 'endOfWeek', 'weekly' => 'endOfWeek', 'month' => 'endOfMonth', '1M' => 'endOfMonth', 'monthly' => 'endOfMonth', '3M' => 'lastOfQuarter', 'quarter' => 'lastOfQuarter', 'quarterly' => 'lastOfQuarter', '1Y' => 'endOfYear', 'year' => 'endOfYear', 'yearly' => 'endOfYear', ]; $currentEnd = clone $theCurrentEnd; if (isset($functionMap[$repeatFreq])) { $function = $functionMap[$repeatFreq]; $currentEnd->$function(); } if (!is_null($maxDate) && $currentEnd > $maxDate) { return clone $maxDate; } return $currentEnd; } /** * @param \Carbon\Carbon $date * @param $repeatFrequency * * @return string * @throws FireflyException */ public function periodShow(Carbon $date, $repeatFrequency) { $formatMap = [ '1D' => '%e %B %Y', 'daily' => '%e %B %Y', '1W' => 'Week %W, %Y', 'week' => 'Week %W, %Y', 'weekly' => 'Week %W, %Y', '3M' => '%B %Y', 'quarter' => '%B %Y', '1M' => '%B %Y', 'month' => '%B %Y', 'monthly' => '%B %Y', '1Y' => '%Y', 'year' => '%Y', 'yearly' => '%Y', ]; if (isset($formatMap[$repeatFrequency])) { return $date->formatLocalized($formatMap[$repeatFrequency]); } throw new FireflyException('No date formats for frequency "' . $repeatFrequency . '"!'); } /** * @param \Carbon\Carbon $theDate * @param $repeatFreq * * @return \Carbon\Carbon * @throws FireflyException */ public function startOfPeriod(Carbon $theDate, $repeatFreq) { $date = clone $theDate; $functionMap = [ '1D' => 'startOfDay', 'daily' => 'startOfDay', '1W' => 'startOfWeek', 'week' => 'startOfWeek', 'weekly' => 'startOfWeek', 'month' => 'startOfMonth', '1M' => 'startOfMonth', 'monthly' => 'startOfMonth', '3M' => 'firstOfQuarter', 'quarter' => 'firstOfQuarter', 'quarterly' => 'firstOfQuarter', 'year' => 'startOfYear', 'yearly' => 'startOfYear', ]; if (isset($functionMap[$repeatFreq])) { $function = $functionMap[$repeatFreq]; $date->$function(); return $date; } if ($repeatFreq == 'half-year' || $repeatFreq == '6M') { $month = $date->month; $date->startOfYear(); if ($month >= 7) { $date->addMonths(6); } return $date; } throw new FireflyException('Cannot do startOfPeriod for $repeat_freq "' . $repeatFreq . '"'); } /** * @param \Carbon\Carbon $theDate * @param $repeatFreq * @param int $subtract * * @return \Carbon\Carbon * @throws FireflyException */ public function subtractPeriod(Carbon $theDate, $repeatFreq, $subtract = 1) { $date = clone $theDate; // 1D 1W 1M 3M 6M 1Y $functionMap = [ '1D' => 'subDays', 'daily' => 'subDays', 'week' => 'subWeeks', '1W' => 'subWeeks', 'weekly' => 'subWeeks', 'month' => 'subMonths', '1M' => 'subMonths', 'monthly' => 'subMonths', 'year' => 'subYears', 'yearly' => 'subYears', ]; $modifierMap = [ 'quarter' => 3, 'quarterly' => 3, 'half-year' => 6, ]; if (isset($functionMap[$repeatFreq])) { $function = $functionMap[$repeatFreq]; $date->$function($subtract); return $date; } if (isset($modifierMap[$repeatFreq])) { $subtract = $subtract * $modifierMap[$repeatFreq]; $date->subMonths($subtract); return $date; } throw new FireflyException('Cannot do subtractPeriod for $repeat_freq "' . $repeatFreq . '"'); } /** * @param $range * @param \Carbon\Carbon $start * * @return \Carbon\Carbon * @throws FireflyException */ public function updateEndDate($range, Carbon $start) { $functionMap = [ '1D' => 'endOfDay', '1W' => 'endOfWeek', '1M' => 'endOfMonth', '3M' => 'lastOfQuarter', '1Y' => 'endOfYear', ]; $end = clone $start; if (isset($functionMap[$range])) { $function = $functionMap[$range]; $end->$function(); return $end; } if ($range == '6M') { if ($start->month >= 7) { $end->endOfYear(); } else { $end->startOfYear()->addMonths(6); } return $end; } throw new FireflyException('updateEndDate cannot handle $range "' . $range . '"'); } /** * @param $range * @param \Carbon\Carbon $start * * @return \Carbon\Carbon * @throws FireflyException */ public function updateStartDate($range, Carbon $start) { $functionMap = [ '1D' => 'startOfDay', '1W' => 'startOfWeek', '1M' => 'startOfMonth', '3M' => 'firstOfQuarter', '1Y' => 'startOfYear', ]; if (isset($functionMap[$range])) { $function = $functionMap[$range]; $start->$function(); return $start; } if ($range == '6M') { if ($start->month >= 7) { $start->startOfYear()->addMonths(6); } else { $start->startOfYear(); } return $start; } throw new FireflyException('updateStartDate cannot handle $range "' . $range . '"'); } }