/** * This method will make a Processor that will process each transaction journal using the triggers * and actions found in the given Rule. * * @param Rule $rule * * @return Processor */ public static function make(Rule $rule) { Log::debug(sprintf('Making new rule from Rule %d', $rule->id)); $self = new self(); $self->rule = $rule; $triggerSet = $rule->ruleTriggers()->orderBy('order', 'ASC')->get(); /** @var RuleTrigger $trigger */ foreach ($triggerSet as $trigger) { $self->triggers->push(TriggerFactory::getTrigger($trigger)); } $self->actions = $rule->ruleActions()->orderBy('order', 'ASC')->get(); return $self; }
/** * @return bool */ protected function triggered() { $foundTriggers = 0; $hitTriggers = 0; /** @var RuleTrigger $trigger */ foreach ($this->rule->ruleTriggers()->orderBy('order', 'ASC')->get() as $trigger) { $foundTriggers++; $type = $trigger->trigger_type; if (!isset($this->triggerTypes[$type])) { abort(500, 'No such trigger exists ("' . $type . '").'); } $class = $this->triggerTypes[$type]; Log::debug('Trigger #' . $trigger->id . ' for rule #' . $trigger->rule_id . ' (' . $type . ')'); if (!class_exists($class)) { abort(500, 'Could not instantiate class for rule trigger type "' . $type . '" (' . $class . ').'); } /** @var TriggerInterface $triggerClass */ $triggerClass = new $class($trigger, $this->journal); if ($triggerClass->triggered()) { $hitTriggers++; } if ($trigger->stop_processing) { break; } } Log::debug('Total: ' . $foundTriggers . ' found triggers. ' . $hitTriggers . ' triggers were hit.'); return $hitTriggers == $foundTriggers; }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function createRules() { // three rule groups to get started. $ruleGroup = new RuleGroup(); $ruleGroup->user()->associate($this->user); $ruleGroup->order = 1; $ruleGroup->active = 1; $ruleGroup->title = 'Default rules'; $ruleGroup->description = 'All your rules not in a particular group.'; $ruleGroup->save(); unset($ruleGroup); $ruleGroup = new RuleGroup(); $ruleGroup->user()->associate($this->user); $ruleGroup->order = 2; $ruleGroup->active = 1; $ruleGroup->title = 'Empty rule group'; $ruleGroup->description = 'Intentionally has no rules.'; $ruleGroup->save(); unset($ruleGroup); $ruleGroup = new RuleGroup(); $ruleGroup->user()->associate($this->user); $ruleGroup->order = 3; $ruleGroup->active = 1; $ruleGroup->title = 'Rules for bills'; $ruleGroup->description = 'All rules for bills and recurring costs.'; $ruleGroup->save(); unset($ruleGroup); // move groceries to correct budget/category $rule = new Rule(); $rule->user()->associate($this->user); $rule->ruleGroup()->associate(RuleGroup::find(1)); $rule->order = 1; $rule->active = 1; $rule->stop_processing = 0; $rule->title = 'Move groceries'; $rule->description = 'Move groceries to correct category and budget.'; $rule->save(); // initial trigger for this rule: $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 1; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'user_action'; $ruleTrigger->trigger_value = 'store-journal'; $ruleTrigger->save(); unset($ruleTrigger); // content trigger for this rule. $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 2; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'description_contains'; $ruleTrigger->trigger_value = 'groceries'; $ruleTrigger->save(); unset($ruleTrigger); // another $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 3; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'from_account_is'; $ruleTrigger->trigger_value = 'TestData Checking Account'; $ruleTrigger->save(); unset($ruleTrigger); // actions for this rule. one, set category $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 1; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_category'; $ruleAction->action_value = 'Groceries'; $ruleAction->save(); unset($ruleAction); // actions for this rule. one, set budget $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 2; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_budget'; $ruleAction->action_value = 'Groceries'; $ruleAction->save(); unset($ruleAction); // move "gas" to "Car" and "Car" $rule = new Rule(); $rule->user()->associate($this->user); $rule->ruleGroup()->associate(RuleGroup::find(1)); $rule->order = 2; $rule->active = 1; $rule->stop_processing = 0; $rule->title = 'Move gas'; $rule->description = null; $rule->save(); // initial trigger for this rule: $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 1; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'user_action'; $ruleTrigger->trigger_value = 'store-journal'; $ruleTrigger->save(); unset($ruleTrigger); // content trigger for this rule. $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 2; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'description_contains'; $ruleTrigger->trigger_value = 'gas'; $ruleTrigger->save(); unset($ruleTrigger); // another $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 3; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'from_account_is'; $ruleTrigger->trigger_value = 'TestData Checking Account'; $ruleTrigger->save(); unset($ruleTrigger); // actions for this rule. one, set category $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 1; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_category'; $ruleAction->action_value = 'Car'; $ruleAction->save(); unset($ruleAction); // actions for this rule. one, set budget $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 2; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_budget'; $ruleAction->action_value = 'Car'; $ruleAction->save(); unset($ruleAction); // move savings to money management $rule = new Rule(); $rule->user()->associate($this->user); $rule->ruleGroup()->associate(RuleGroup::find(1)); $rule->order = 3; $rule->active = 1; $rule->stop_processing = 0; $rule->title = 'Move savings'; $rule->description = null; $rule->save(); // initial trigger for this rule: $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 1; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'user_action'; $ruleTrigger->trigger_value = 'store-journal'; $ruleTrigger->save(); unset($ruleTrigger); // is transfer $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 2; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'transaction_type'; $ruleTrigger->trigger_value = 'Transfer'; $ruleTrigger->save(); unset($ruleTrigger); // content trigger for this rule. $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 3; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'description_is'; $ruleTrigger->trigger_value = 'Save money'; $ruleTrigger->save(); unset($ruleTrigger); // another $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 4; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'from_account_is'; $ruleTrigger->trigger_value = 'TestData Checking Account'; $ruleTrigger->save(); unset($ruleTrigger); // another $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 5; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'to_account_is'; $ruleTrigger->trigger_value = 'TestData Savings'; $ruleTrigger->save(); unset($ruleTrigger); // actions for this rule. one, set category $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 1; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_category'; $ruleAction->action_value = 'Money Management'; $ruleAction->save(); unset($ruleAction); // move TV bill to "Bills" and "House" $rule = new Rule(); $rule->user()->associate($this->user); $rule->ruleGroup()->associate(RuleGroup::find(3)); $rule->order = 1; $rule->active = 1; $rule->stop_processing = 0; $rule->title = 'TV Bill'; $rule->description = null; $rule->save(); // initial trigger for this rule: $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 1; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'user_action'; $ruleTrigger->trigger_value = 'store-journal'; $ruleTrigger->save(); unset($ruleTrigger); // content trigger for this rule. $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 2; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'description_contains'; $ruleTrigger->trigger_value = 'tv bill'; $ruleTrigger->save(); unset($ruleTrigger); // another $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 3; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'from_account_is'; $ruleTrigger->trigger_value = 'TestData Checking Account'; $ruleTrigger->save(); unset($ruleTrigger); // actions for this rule. one, set category $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 1; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_category'; $ruleAction->action_value = 'House'; $ruleAction->save(); unset($ruleAction); // actions for this rule. one, set budget $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 2; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_budget'; $ruleAction->action_value = 'Bills'; $ruleAction->save(); unset($ruleAction); // move rent to bills, rent. $rule = new Rule(); $rule->user()->associate($this->user); $rule->ruleGroup()->associate(RuleGroup::find(3)); $rule->order = 2; $rule->active = 1; $rule->stop_processing = 1; $rule->title = 'Rent'; $rule->description = 'Do something with rent.'; $rule->save(); // initial trigger for this rule: $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 1; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'user_action'; $ruleTrigger->trigger_value = 'update-journal'; $ruleTrigger->save(); unset($ruleTrigger); // content trigger for this rule. $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 2; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 0; $ruleTrigger->trigger_type = 'description_contains'; $ruleTrigger->trigger_value = 'rent'; $ruleTrigger->save(); unset($ruleTrigger); // another $ruleTrigger = new RuleTrigger(); $ruleTrigger->rule()->associate($rule); $ruleTrigger->order = 3; $ruleTrigger->active = 1; $ruleTrigger->stop_processing = 1; $ruleTrigger->trigger_type = 'from_account_is'; $ruleTrigger->trigger_value = 'TestData Checking Account'; $ruleTrigger->save(); unset($ruleTrigger); // actions for this rule. one, set category $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 1; $ruleAction->active = 1; $ruleAction->stop_processing = 0; $ruleAction->action_type = 'set_category'; $ruleAction->action_value = 'House'; $ruleAction->save(); unset($ruleAction); // actions for this rule. one, set budget $ruleAction = new RuleAction(); $ruleAction->rule()->associate($rule); $ruleAction->order = 2; $ruleAction->active = 1; $ruleAction->stop_processing = 1; $ruleAction->action_type = 'set_budget'; $ruleAction->action_value = 'Bills'; $ruleAction->save(); unset($ruleAction); }
/** * @return Collection */ private function getUserRules() : Collection { $set = Rule::distinct()->where('rules.user_id', $this->user->id)->leftJoin('rule_groups', 'rule_groups.id', '=', 'rules.rule_group_id')->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id')->where('rule_groups.active', 1)->where('rule_triggers.trigger_type', 'user_action')->where('rule_triggers.trigger_value', 'store-journal')->where('rules.active', 1)->orderBy('rule_groups.order', 'ASC')->orderBy('rules.order', 'ASC')->get(['rules.*']); Log::debug(sprintf('Found %d user rules.', $set->count())); return $set; }
/** * @param Rule $rule * @param array $data * * @return Rule */ public function update(Rule $rule, array $data) { // update rule: $rule->active = $data['active']; $rule->stop_processing = $data['stop_processing']; $rule->title = $data['title']; $rule->description = $data['description']; $rule->save(); // delete triggers: $rule->ruleTriggers()->delete(); // delete actions: $rule->ruleActions()->delete(); // recreate triggers: $order = 1; $stopProcessing = false; $triggerValues = ['action' => 'user_action', 'value' => $data['trigger'], 'stopProcessing' => $stopProcessing, 'order' => $order]; $this->storeTrigger($rule, $triggerValues); foreach ($data['rule-triggers'] as $index => $trigger) { $value = $data['rule-trigger-values'][$index]; $stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false; $triggerValues = ['action' => $trigger, 'value' => $value, 'stopProcessing' => $stopProcessing, 'order' => $order]; $this->storeTrigger($rule, $triggerValues); $order++; } // recreate actions: $order = 1; foreach ($data['rule-actions'] as $index => $action) { $value = $data['rule-action-values'][$index]; $stopProcessing = isset($data['rule-action-stop'][$index]) ? true : false; $actionValues = ['action' => $action, 'value' => $value, 'stopProcessing' => $stopProcessing, 'order' => $order]; $this->storeAction($rule, $actionValues); } return $rule; }
/** * @param Rule $rule * @param array $data * * @return Rule */ public function update(Rule $rule, array $data) : Rule { // update rule: $rule->active = $data['active']; $rule->stop_processing = $data['stop_processing']; $rule->title = $data['title']; $rule->description = $data['description']; $rule->save(); // delete triggers: $rule->ruleTriggers()->delete(); // delete actions: $rule->ruleActions()->delete(); // recreate triggers: $this->storeTriggers($rule, $data); // recreate actions: $this->storeActions($rule, $data); return $rule; }