| 
									
										
										
										
											2016-01-15 11:16:41 +01:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2016-05-20 12:41:23 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * RuleGroupRepository.php | 
					
						
							|  |  |  |  * Copyright (C) 2016 thegrumpydictator@gmail.com | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-10-05 06:52:15 +02:00
										 |  |  |  * This software may be modified and distributed under the terms of the | 
					
						
							|  |  |  |  * Creative Commons Attribution-ShareAlike 4.0 International License. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * See the LICENSE file for details. | 
					
						
							| 
									
										
										
										
											2016-05-20 12:41:23 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-05 12:08:25 +01:00
										 |  |  | declare(strict_types = 1); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:16:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace FireflyIII\Repositories\RuleGroup; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  | use FireflyIII\Models\Rule; | 
					
						
							|  |  |  | use FireflyIII\Models\RuleGroup; | 
					
						
							| 
									
										
										
										
											2016-02-17 17:27:41 +01:00
										 |  |  | use FireflyIII\User; | 
					
						
							|  |  |  | use Illuminate\Database\Eloquent\Relations\HasMany; | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  | use Illuminate\Support\Collection; | 
					
						
							| 
									
										
										
										
											2016-03-03 09:05:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 17:38:09 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Class RuleGroupRepository | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package FireflyIII\Repositories\RuleGroup | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  | class RuleGroupRepository implements RuleGroupRepositoryInterface | 
					
						
							| 
									
										
										
										
											2016-01-15 11:16:41 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |     /** @var User */ | 
					
						
							|  |  |  |     private $user; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * BillRepository constructor. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param User $user | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function __construct(User $user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->user = $user; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-30 16:42:58 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param User $user | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setUser(User $user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->user = $user; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-24 16:50:55 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @return int | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function count(): int | 
					
						
							| 
									
										
										
										
											2016-01-24 16:50:55 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         return $this->user->ruleGroups()->count(); | 
					
						
							| 
									
										
										
										
											2016-01-24 16:50:55 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2017-01-14 19:43:33 +01:00
										 |  |  |      * @param RuleGroup      $ruleGroup | 
					
						
							|  |  |  |      * @param RuleGroup|null $moveTo | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |      * @return bool | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function destroy(RuleGroup $ruleGroup, RuleGroup $moveTo = null): bool | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         /** @var Rule $rule */ | 
					
						
							|  |  |  |         foreach ($ruleGroup->rules as $rule) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (is_null($moveTo)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $rule->delete(); | 
					
						
							| 
									
										
										
										
											2016-05-20 17:53:03 +02:00
										 |  |  |                 continue; | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-05-20 17:53:03 +02:00
										 |  |  |             // move
 | 
					
						
							|  |  |  |             $rule->ruleGroup()->associate($moveTo); | 
					
						
							|  |  |  |             $rule->save(); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $ruleGroup->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->resetRuleGroupOrder(); | 
					
						
							|  |  |  |         if (!is_null($moveTo)) { | 
					
						
							|  |  |  |             $this->resetRulesInGroupOrder($moveTo); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-23 12:10:22 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param int $ruleGroupId | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return RuleGroup | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function find(int $ruleGroupId): RuleGroup | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $group = $this->user->ruleGroups()->find($ruleGroupId); | 
					
						
							|  |  |  |         if (is_null($group)) { | 
					
						
							|  |  |  |             return new RuleGroup; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $group; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @return Collection | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function get(): Collection | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         return $this->user->ruleGroups()->orderBy('order', 'ASC')->get(); | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @return int | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function getHighestOrderRuleGroup(): int | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         $entry = $this->user->ruleGroups()->max('order'); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return intval($entry); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-17 17:27:41 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param User $user | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Collection | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getRuleGroupsWithRules(User $user): Collection | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $user->ruleGroups() | 
					
						
							|  |  |  |                     ->orderBy('active', 'DESC') | 
					
						
							|  |  |  |                     ->orderBy('order', 'ASC') | 
					
						
							|  |  |  |                     ->with( | 
					
						
							|  |  |  |                         [ | 
					
						
							|  |  |  |                             'rules'              => function (HasMany $query) { | 
					
						
							|  |  |  |                                 $query->orderBy('active', 'DESC'); | 
					
						
							|  |  |  |                                 $query->orderBy('order', 'ASC'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                             }, | 
					
						
							|  |  |  |                             'rules.ruleTriggers' => function (HasMany $query) { | 
					
						
							|  |  |  |                                 $query->orderBy('order', 'ASC'); | 
					
						
							|  |  |  |                             }, | 
					
						
							|  |  |  |                             'rules.ruleActions'  => function (HasMany $query) { | 
					
						
							|  |  |  |                                 $query->orderBy('order', 'ASC'); | 
					
						
							|  |  |  |                             }, | 
					
						
							|  |  |  |                         ] | 
					
						
							|  |  |  |                     )->get(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param RuleGroup $ruleGroup | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function moveDown(RuleGroup $ruleGroup): bool | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         $order = $ruleGroup->order; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |         // find the rule with order+1 and give it order-1
 | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         $other = $this->user->ruleGroups()->where('order', ($order + 1))->first(); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |         if ($other) { | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |             $other->order = ($other->order - 1); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |             $other->save(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |         $ruleGroup->order = ($ruleGroup->order + 1); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |         $ruleGroup->save(); | 
					
						
							|  |  |  |         $this->resetRuleGroupOrder(); | 
					
						
							| 
									
										
										
										
											2016-04-25 18:43:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @param RuleGroup $ruleGroup | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function moveUp(RuleGroup $ruleGroup): bool | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         $order = $ruleGroup->order; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |         // find the rule with order-1 and give it order+1
 | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         $other = $this->user->ruleGroups()->where('order', ($order - 1))->first(); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |         if ($other) { | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |             $other->order = ($other->order + 1); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |             $other->save(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 13:59:54 +01:00
										 |  |  |         $ruleGroup->order = ($ruleGroup->order - 1); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |         $ruleGroup->save(); | 
					
						
							|  |  |  |         $this->resetRuleGroupOrder(); | 
					
						
							| 
									
										
										
										
											2016-04-25 18:43:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 21:05:43 +02:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function resetRuleGroupOrder(): bool | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         $this->user->ruleGroups()->whereNotNull('deleted_at')->update(['order' => 0]); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 09:00:15 +01:00
										 |  |  |         $set   = $this->user->ruleGroups()->where('active', 1)->orderBy('order', 'ASC')->get(); | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |         $count = 1; | 
					
						
							|  |  |  |         /** @var RuleGroup $entry */ | 
					
						
							|  |  |  |         foreach ($set as $entry) { | 
					
						
							|  |  |  |             $entry->order = $count; | 
					
						
							|  |  |  |             $entry->save(); | 
					
						
							|  |  |  |             $count++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @param RuleGroup $ruleGroup | 
					
						
							| 
									
										
										
										
											2016-01-15 13:13:21 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function resetRulesInGroupOrder(RuleGroup $ruleGroup): bool | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         $ruleGroup->rules()->whereNotNull('deleted_at')->update(['order' => 0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $set   = $ruleGroup->rules() | 
					
						
							|  |  |  |                            ->orderBy('order', 'ASC') | 
					
						
							|  |  |  |                            ->orderBy('updated_at', 'DESC') | 
					
						
							|  |  |  |                            ->get(); | 
					
						
							|  |  |  |         $count = 1; | 
					
						
							|  |  |  |         /** @var Rule $entry */ | 
					
						
							|  |  |  |         foreach ($set as $entry) { | 
					
						
							|  |  |  |             $entry->order = $count; | 
					
						
							|  |  |  |             $entry->save(); | 
					
						
							|  |  |  |             $count++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @param array $data | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return RuleGroup | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function store(array $data): RuleGroup | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         $order = $this->getHighestOrderRuleGroup(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $newRuleGroup = new RuleGroup( | 
					
						
							|  |  |  |             [ | 
					
						
							| 
									
										
										
										
											2016-10-23 12:19:32 +02:00
										 |  |  |                 'user_id'     => $this->user->id, | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |                 'title'       => $data['title'], | 
					
						
							|  |  |  |                 'description' => $data['description'], | 
					
						
							|  |  |  |                 'order'       => ($order + 1), | 
					
						
							|  |  |  |                 'active'      => 1, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         $newRuleGroup->save(); | 
					
						
							|  |  |  |         $this->resetRuleGroupOrder(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $newRuleGroup; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @param RuleGroup $ruleGroup | 
					
						
							|  |  |  |      * @param array     $data | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return RuleGroup | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-06 09:27:45 +02:00
										 |  |  |     public function update(RuleGroup $ruleGroup, array $data): RuleGroup | 
					
						
							| 
									
										
										
										
											2016-01-15 11:27:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         // update the account:
 | 
					
						
							|  |  |  |         $ruleGroup->title       = $data['title']; | 
					
						
							|  |  |  |         $ruleGroup->description = $data['description']; | 
					
						
							|  |  |  |         $ruleGroup->active      = $data['active']; | 
					
						
							|  |  |  |         $ruleGroup->save(); | 
					
						
							|  |  |  |         $this->resetRuleGroupOrder(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $ruleGroup; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-28 21:50:20 +01:00
										 |  |  | } |