| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * RecurrenceValidation.php | 
					
						
							| 
									
										
										
										
											2020-02-16 13:58:22 +01:00
										 |  |  |  * Copyright (c) 2019 james@firefly-iii.org | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This file is part of Firefly III (https://github.com/firefly-iii). | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as | 
					
						
							|  |  |  |  * published by the Free Software Foundation, either version 3 of the | 
					
						
							|  |  |  |  * License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * GNU Affero General Public License for more details. | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare(strict_types=1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace FireflyIII\Validation; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use Carbon\Carbon; | 
					
						
							| 
									
										
										
										
											2021-03-15 19:51:55 +01:00
										 |  |  | use FireflyIII\Models\Recurrence; | 
					
						
							|  |  |  | use FireflyIII\Models\RecurrenceTransaction; | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  | use Illuminate\Validation\Validator; | 
					
						
							|  |  |  | use InvalidArgumentException; | 
					
						
							| 
									
										
										
										
											2018-08-04 17:30:47 +02:00
										 |  |  | use Log; | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Trait RecurrenceValidation | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contains advanced validation rules used in validation of new and existing recurrences. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | trait RecurrenceValidation | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Validate account information input for recurrences which are being updated. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-06-11 20:39:01 +02:00
										 |  |  |      * See reference nr. 101 | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function valUpdateAccountInfo(Validator $validator): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data = $validator->getData(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $transactionType = $data['type'] ?? 'invalid'; | 
					
						
							| 
									
										
										
										
											2021-03-15 19:51:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // grab model from parameter and try to set the transaction type from it
 | 
					
						
							|  |  |  |         if ('invalid' === $transactionType) { | 
					
						
							|  |  |  |             Log::debug('Type is invalid but we will search for it.'); | 
					
						
							|  |  |  |             /** @var Recurrence $recurrence */ | 
					
						
							|  |  |  |             $recurrence = $this->route()->parameter('recurrence'); | 
					
						
							|  |  |  |             if (null !== $recurrence) { | 
					
						
							|  |  |  |                 Log::debug('There is a recurrence in the route.'); | 
					
						
							|  |  |  |                 // ok so we have a recurrence should be able to extract type somehow.
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:51:27 +02:00
										 |  |  |                 /** @var RecurrenceTransaction|null $first */ | 
					
						
							| 
									
										
										
										
											2021-03-15 19:51:55 +01:00
										 |  |  |                 $first = $recurrence->recurrenceTransactions()->first(); | 
					
						
							|  |  |  |                 if (null !== $first) { | 
					
						
							|  |  |  |                     $transactionType = $first->transactionType ? $first->transactionType->type : 'withdrawal'; | 
					
						
							|  |  |  |                     Log::debug(sprintf('Determined type to be %s.', $transactionType)); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |                 if (null === $first) { | 
					
						
							| 
									
										
										
										
											2021-03-15 19:51:55 +01:00
										 |  |  |                     Log::warning('Just going to assume type is a withdrawal.'); | 
					
						
							|  |  |  |                     $transactionType = 'withdrawal'; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $transactions = $data['transactions'] ?? []; | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /** @var AccountValidator $accountValidator */ | 
					
						
							|  |  |  |         $accountValidator = app(AccountValidator::class); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Log::debug(sprintf('Going to loop %d transaction(s)', count($transactions))); | 
					
						
							|  |  |  |         foreach ($transactions as $index => $transaction) { | 
					
						
							|  |  |  |             $transactionType = $transaction['type'] ?? $transactionType; | 
					
						
							|  |  |  |             $accountValidator->setTransactionType($transactionType); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             if ( | 
					
						
							|  |  |  |                 !array_key_exists('source_id', $transaction) | 
					
						
							|  |  |  |                 && !array_key_exists('destination_id', $transaction) | 
					
						
							|  |  |  |                 && !array_key_exists('source_name', $transaction) | 
					
						
							|  |  |  |                 && !array_key_exists('destination_name', $transaction) | 
					
						
							| 
									
										
										
										
											2021-03-20 19:17:22 +01:00
										 |  |  |             ) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  |             // validate source account.
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:51:27 +02:00
										 |  |  |             $sourceId    = array_key_exists('source_id', $transaction) ? (int)$transaction['source_id'] : null; | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  |             $sourceName  = $transaction['source_name'] ?? null; | 
					
						
							| 
									
										
										
										
											2020-03-31 07:04:00 +02:00
										 |  |  |             $validSource = $accountValidator->validateSource($sourceId, $sourceName, null); | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // do something with result:
 | 
					
						
							|  |  |  |             if (false === $validSource) { | 
					
						
							|  |  |  |                 $validator->errors()->add(sprintf('transactions.%d.source_id', $index), $accountValidator->sourceError); | 
					
						
							|  |  |  |                 $validator->errors()->add(sprintf('transactions.%d.source_name', $index), $accountValidator->sourceError); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             // validate destination account
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:51:27 +02:00
										 |  |  |             $destinationId    = array_key_exists('destination_id', $transaction) ? (int)$transaction['destination_id'] : null; | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  |             $destinationName  = $transaction['destination_name'] ?? null; | 
					
						
							| 
									
										
										
										
											2020-03-31 07:04:00 +02:00
										 |  |  |             $validDestination = $accountValidator->validateDestination($destinationId, $destinationName, null); | 
					
						
							| 
									
										
										
										
											2019-08-27 05:57:09 +02:00
										 |  |  |             // do something with result:
 | 
					
						
							|  |  |  |             if (false === $validDestination) { | 
					
						
							|  |  |  |                 $validator->errors()->add(sprintf('transactions.%d.destination_id', $index), $accountValidator->destError); | 
					
						
							|  |  |  |                 $validator->errors()->add(sprintf('transactions.%d.destination_name', $index), $accountValidator->destError); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-06 19:14:30 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Adds an error to the validator when there are no repetitions in the array of data. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function validateOneRepetition(Validator $validator): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data        = $validator->getData(); | 
					
						
							|  |  |  |         $repetitions = $data['repetitions'] ?? []; | 
					
						
							|  |  |  |         // need at least one transaction
 | 
					
						
							| 
									
										
										
										
											2021-06-12 19:32:34 +02:00
										 |  |  |         if (!is_countable($repetitions) || empty($repetitions)) { | 
					
						
							| 
									
										
										
										
											2019-08-26 18:15:44 +02:00
										 |  |  |             $validator->errors()->add('repetitions', (string)trans('validation.at_least_one_repetition')); | 
					
						
							| 
									
										
										
										
											2018-08-06 19:14:30 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-26 19:09:55 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Adds an error to the validator when there are no repetitions in the array of data. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function validateOneRepetitionUpdate(Validator $validator): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data        = $validator->getData(); | 
					
						
							|  |  |  |         $repetitions = $data['repetitions'] ?? null; | 
					
						
							|  |  |  |         if (null === $repetitions) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // need at least one transaction
 | 
					
						
							| 
									
										
										
										
											2021-06-12 19:32:34 +02:00
										 |  |  |         if (empty($repetitions)) { | 
					
						
							| 
									
										
										
										
											2019-08-26 19:09:55 +02:00
										 |  |  |             $validator->errors()->add('repetitions', (string)trans('validation.at_least_one_repetition')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-06 19:14:30 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Validates that the recurrence has valid repetition information. It either doesn't stop, | 
					
						
							|  |  |  |      * or stops after X times or at X date. Not both of them., | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function validateRecurrenceRepetition(Validator $validator): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data        = $validator->getData(); | 
					
						
							|  |  |  |         $repetitions = $data['nr_of_repetitions'] ?? null; | 
					
						
							|  |  |  |         $repeatUntil = $data['repeat_until'] ?? null; | 
					
						
							|  |  |  |         if (null !== $repetitions && null !== $repeatUntil) { | 
					
						
							|  |  |  |             // expect a date OR count:
 | 
					
						
							|  |  |  |             $validator->errors()->add('repeat_until', (string)trans('validation.require_repeat_until')); | 
					
						
							|  |  |  |             $validator->errors()->add('nr_of_repetitions', (string)trans('validation.require_repeat_until')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |     public function validateRecurringConfig(Validator $validator) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data        = $validator->getData(); | 
					
						
							|  |  |  |         $reps        = array_key_exists('nr_of_repetitions', $data) ? (int)$data['nr_of_repetitions'] : null; | 
					
						
							|  |  |  |         $repeatUntil = array_key_exists('repeat_until', $data) ? new Carbon($data['repeat_until']) : null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (null === $reps && null === $repeatUntil) { | 
					
						
							|  |  |  |             $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); | 
					
						
							|  |  |  |             $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($reps > 0 && null !== $repeatUntil) { | 
					
						
							|  |  |  |             $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); | 
					
						
							|  |  |  |             $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function validateRepetitionMoment(Validator $validator): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data        = $validator->getData(); | 
					
						
							|  |  |  |         $repetitions = $data['repetitions'] ?? []; | 
					
						
							| 
									
										
										
										
											2021-03-06 16:15:39 +01:00
										 |  |  |         if (!is_array($repetitions)) { | 
					
						
							|  |  |  |             $validator->errors()->add(sprintf('repetitions.%d.type', 0), (string)trans('validation.valid_recurrence_rep_type')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * @var int   $index | 
					
						
							|  |  |  |          * @var array $repetition | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         foreach ($repetitions as $index => $repetition) { | 
					
						
							| 
									
										
										
										
											2021-03-12 18:31:19 +01:00
										 |  |  |             if (!array_key_exists('moment', $repetition)) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (null === $repetition['moment']) { | 
					
						
							| 
									
										
										
										
											2021-03-06 16:15:39 +01:00
										 |  |  |                 $repetition['moment'] = ''; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $repetition['moment'] = $repetition['moment'] ?? 'invalid'; | 
					
						
							| 
									
										
										
										
											2019-08-22 17:56:48 +02:00
										 |  |  |             switch ($repetition['type'] ?? 'empty') { | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |                 default: | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |                     $validator->errors()->add(sprintf('repetitions.%d.type', $index), (string)trans('validation.valid_recurrence_rep_type')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 case 'daily': | 
					
						
							|  |  |  |                     $this->validateDaily($validator, $index, (string)$repetition['moment']); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case 'monthly': | 
					
						
							|  |  |  |                     $this->validateMonthly($validator, $index, (int)$repetition['moment']); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case 'ndom': | 
					
						
							|  |  |  |                     $this->validateNdom($validator, $index, (string)$repetition['moment']); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case 'weekly': | 
					
						
							|  |  |  |                     $this->validateWeekly($validator, $index, (int)$repetition['moment']); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case 'yearly': | 
					
						
							|  |  |  |                     $this->validateYearly($validator, $index, (string)$repetition['moment']); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * If the repetition type is daily, the moment should be empty. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      * @param int       $index | 
					
						
							|  |  |  |      * @param string    $moment | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function validateDaily(Validator $validator, int $index, string $moment): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ('' !== $moment) { | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * If the repetition type is monthly, the moment should be a day between 1-31 (inclusive). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      * @param int       $index | 
					
						
							|  |  |  |      * @param int       $dayOfMonth | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function validateMonthly(Validator $validator, int $index, int $dayOfMonth): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($dayOfMonth < 1 || $dayOfMonth > 31) { | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * If the repetition type is "ndom", the first part must be between 1-5 (inclusive), for the week in the month, | 
					
						
							|  |  |  |      * and the second one must be between 1-7 (inclusive) for the day of the week. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      * @param int       $index | 
					
						
							|  |  |  |      * @param string    $moment | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function validateNdom(Validator $validator, int $index, string $moment): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $parameters = explode(',', $moment); | 
					
						
							| 
									
										
										
										
											2019-05-30 12:31:19 +02:00
										 |  |  |         if (2 !== count($parameters)) { | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $nthDay    = (int)($parameters[0] ?? 0.0); | 
					
						
							|  |  |  |         $dayOfWeek = (int)($parameters[1] ?? 0.0); | 
					
						
							|  |  |  |         if ($nthDay < 1 || $nthDay > 5) { | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($dayOfWeek < 1 || $dayOfWeek > 7) { | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * If the repetition type is weekly, the moment should be a day between 1-7 (inclusive). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      * @param int       $index | 
					
						
							|  |  |  |      * @param int       $dayOfWeek | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function validateWeekly(Validator $validator, int $index, int $dayOfWeek): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($dayOfWeek < 1 || $dayOfWeek > 7) { | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * If the repetition type is yearly, the moment should be a valid date. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Validator $validator | 
					
						
							|  |  |  |      * @param int       $index | 
					
						
							|  |  |  |      * @param string    $moment | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function validateYearly(Validator $validator, int $index, string $moment): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             Carbon::createFromFormat('Y-m-d', $moment); | 
					
						
							| 
									
										
										
										
											2020-07-31 15:12:26 +02:00
										 |  |  |         } catch (InvalidArgumentException $e) { | 
					
						
							| 
									
										
										
										
											2018-08-04 17:30:47 +02:00
										 |  |  |             Log::debug(sprintf('Invalid argument for Carbon: %s', $e->getMessage())); | 
					
						
							| 
									
										
										
										
											2018-07-15 09:38:49 +02:00
										 |  |  |             $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); | 
					
						
							| 
									
										
										
										
											2018-07-05 18:02:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-07-22 20:32:02 +02:00
										 |  |  | } |