/** * @return array */ public function rules() { $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title'; if (RuleGroup::find(Input::get('id'))) { $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title,' . intval(Input::get('id')); } return ['title' => $titleRule, 'description' => 'between:1,5000']; }
/** * Collects a list of rule processors, one for each rule within the rule group * * @return array */ protected function collectProcessors() { // Find all rules belonging to this rulegroup $rules = $this->ruleGroup->rules()->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id')->where('rule_triggers.trigger_type', 'user_action')->where('rule_triggers.trigger_value', 'store-journal')->where('rules.active', 1)->get(['rules.*']); // Create a list of processors for these rules return array_map(function ($rule) { return Processor::make($rule); }, $rules->all()); }
/** * @return array */ public function rules() { $validTriggers = array_keys(config('firefly.rule-triggers')); $validActions = array_keys(config('firefly.rule-actions')); // some actions require text: $contextActions = join(',', config('firefly.rule-actions-text')); $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title'; if (RuleGroup::find(Input::get('id'))) { $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title,' . intval(Input::get('id')); } $rules = ['title' => $titleRule, 'description' => 'between:1,5000', 'stop_processing' => 'boolean', 'rule_group_id' => 'required|belongsToUser:rule_groups', 'trigger' => 'required|in:store-journal,update-journal', 'rule-trigger.*' => 'required|in:' . join(',', $validTriggers), 'rule-trigger-value.*' => 'required|min:1|ruleTriggerValue', 'rule-action.*' => 'required|in:' . join(',', $validActions)]; // since Laravel does not support this stuff yet, here's a trick. for ($i = 0; $i < 10; $i++) { $rules['rule-action-value.' . $i] = 'required_if:rule-action.' . $i . ',' . $contextActions . '|ruleActionValue'; } return $rules; }
/** * @param RuleGroup $ruleGroup * @param array $data * * @return RuleGroup */ public function update(RuleGroup $ruleGroup, array $data) { // update the account: $ruleGroup->title = $data['title']; $ruleGroup->description = $data['description']; $ruleGroup->active = $data['active']; $ruleGroup->save(); $this->resetRuleGroupOrder(); return $ruleGroup; }
/** * @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); }
/** * @param RuleGroup $ruleGroup * * @return bool */ public function resetRulesInGroupOrder(RuleGroup $ruleGroup) { $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; }