Fixed various bugs.

This commit is contained in:
James Cole
2016-01-15 09:25:32 +01:00
parent f80bc214f9
commit 209258b507
8 changed files with 160 additions and 49 deletions

View File

@@ -49,7 +49,7 @@ class FireRulesForStore
// get all the user's rule groups, with the rules, order by 'order'. // get all the user's rule groups, with the rules, order by 'order'.
/** @var User $user */ /** @var User $user */
$user = Auth::user(); $user = Auth::user();
$groups = $user->ruleGroups()->orderBy('order', 'ASC')->get(); $groups = $user->ruleGroups()->where('rule_groups.active', 1)->orderBy('order', 'ASC')->get();
// //
/** @var RuleGroup $group */ /** @var RuleGroup $group */
foreach ($groups as $group) { foreach ($groups as $group) {
@@ -58,16 +58,17 @@ class FireRulesForStore
->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id')
->where('rule_triggers.trigger_type', 'user_action') ->where('rule_triggers.trigger_type', 'user_action')
->where('rule_triggers.trigger_value', 'store-journal') ->where('rule_triggers.trigger_value', 'store-journal')
->where('rules.active', 1)
->get(['rules.*']); ->get(['rules.*']);
/** @var Rule $rule */ /** @var Rule $rule */
foreach ($rules as $rule) { foreach ($rules as $rule) {
Log::debug('Now handling rule #' . $rule->id . ' (' . $rule->title. ')'); Log::debug('Now handling rule #' . $rule->id . ' (' . $rule->title . ')');
$processor = new Processor($rule, $event->journal); $processor = new Processor($rule, $event->journal);
// get some return out of this? // get some return out of this?
$processor->handle(); $processor->handle();
if($rule->stop_processing) { if ($rule->stop_processing) {
break; break;
} }

View File

@@ -217,8 +217,8 @@ class RuleController extends Controller
$actionCount = 0; $actionCount = 0;
// collection of those triggers/actions. // collection of those triggers/actions.
$triggers = []; $oldTriggers = [];
$actions = []; $oldActions = [];
// has old input? // has old input?
if (Input::old()) { if (Input::old()) {
@@ -284,14 +284,15 @@ class RuleController extends Controller
'count' => $count, 'count' => $count,
] ]
)->render(); )->render();
$newIndex++;
} }
$newIndex++;
} }
// get current actions // get current actions
$newIndex = 0; $newIndex = 0;
/** /**
* @var int $index * @var int $index
* @var RuleAction $entry * @var RuleAction $entry
*/ */
foreach ($rule->ruleActions as $index => $entry) { foreach ($rule->ruleActions as $index => $entry) {
@@ -314,7 +315,7 @@ class RuleController extends Controller
} }
// get rule trigger for update / store-journal: // get rule trigger for update / store-journal:
$primaryTrigger = $rule->ruleTriggers()->where('trigger_type','user_action')->first()->trigger_value; $primaryTrigger = $rule->ruleTriggers()->where('trigger_type', 'user_action')->first()->trigger_value;
$subTitle = trans('firefly.edit_rule', ['title' => $rule->title]); $subTitle = trans('firefly.edit_rule', ['title' => $rule->title]);
@@ -327,10 +328,49 @@ class RuleController extends Controller
Session::flash('gaEventCategory', 'rules'); Session::flash('gaEventCategory', 'rules');
Session::flash('gaEventAction', 'edit-rule'); Session::flash('gaEventAction', 'edit-rule');
return view('rules.rule.edit', compact('rule', 'subTitle','primaryTrigger', return view('rules.rule.edit', compact('rule', 'subTitle', 'primaryTrigger',
'oldTriggers', 'oldActions', 'triggerCount', 'actionCount')); 'oldTriggers', 'oldActions', 'triggerCount', 'actionCount'));
} }
/**
* @param RuleRepositoryInterface $repository
* @param RuleFormRequest $request
* @param Rule $rule
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function updateRule(RuleRepositoryInterface $repository, RuleFormRequest $request, Rule $rule)
{
// process the rule itself:
$data = [
'title' => $request->get('title'),
'active' => intval($request->get('active')) == 1,
'trigger' => $request->get('trigger'),
'description' => $request->get('description'),
'rule-triggers' => $request->get('rule-trigger'),
'rule-trigger-values' => $request->get('rule-trigger-value'),
'rule-trigger-stop' => $request->get('rule-trigger-stop'),
'rule-actions' => $request->get('rule-action'),
'rule-action-values' => $request->get('rule-action-value'),
'rule-action-stop' => $request->get('rule-action-stop'),
'stop_processing' => intval($request->get('stop_processing')) == 1,
];
$repository->updateRule($rule, $data);
Session::flash('success', trans('firefly.updated_rule', ['title' => $rule->title]));
Preferences::mark();
if (intval(Input::get('return_to_edit')) === 1) {
// set value so edit routine will not overwrite URL:
Session::put('rules.rule.edit.fromUpdate', true);
return redirect(route('rules.rule.edit', [$rule->id]))->withInput(['return_to_edit' => 1]);
}
// redirect to previous URL.
return redirect(Session::get('rules.rule.edit.url'));
}
/** /**
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup

View File

@@ -62,7 +62,6 @@ class RuleFormRequest extends Request
for ($i = 0; $i < 10; $i++) { for ($i = 0; $i < 10; $i++) {
$rules['rule-action-value.' . $i] = 'required_if:rule-action.' . $i . ',' . $contextActions . '|ruleActionValue'; $rules['rule-action-value.' . $i] = 'required_if:rule-action.' . $i . ',' . $contextActions . '|ruleActionValue';
} }
return $rules; return $rules;
} }
} }

View File

@@ -409,4 +409,47 @@ class RuleRepository implements RuleRepositoryInterface
return $ruleAction; return $ruleAction;
} }
/**
* @param Rule $rule
* @param array $data
* @return Rule
*/
public function updateRule(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;
$this->storeTrigger($rule, 'user_action', $data['trigger'], $stopProcessing, $order);
foreach ($data['rule-triggers'] as $index => $trigger) {
$value = $data['rule-trigger-values'][$index];
$stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false;
$this->storeTrigger($rule, $trigger, $value, $stopProcessing, $order);
$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;
$this->storeAction($rule, $action, $value, $stopProcessing, $order);
}
return $rule;
}
} }

View File

@@ -60,14 +60,14 @@ interface RuleRepositoryInterface
public function destroyRule(Rule $rule); public function destroyRule(Rule $rule);
/** /**
* @param Rule $rule * @param Rule $rule
* @param array $ids * @param array $ids
* @return bool * @return bool
*/ */
public function reorderRuleTriggers(Rule $rule, array $ids); public function reorderRuleTriggers(Rule $rule, array $ids);
/** /**
* @param Rule $rule * @param Rule $rule
* @param array $ids * @param array $ids
* @return bool * @return bool
*/ */
@@ -89,6 +89,13 @@ interface RuleRepositoryInterface
*/ */
public function moveRuleUp(Rule $rule); public function moveRuleUp(Rule $rule);
/**
* @param Rule $rule
* @param array $data
* @return Rule
*/
public function updateRule(Rule $rule, array $data);
/** /**
* @param Rule $rule * @param Rule $rule
* @return bool * @return bool
@@ -128,22 +135,22 @@ interface RuleRepositoryInterface
/** /**
* @param Rule $rule * @param Rule $rule
* @param string $action * @param string $action
* @param string $value * @param string $value
* @param bool $stopProcessing * @param bool $stopProcessing
* @param int $order * @param int $order
* *
* @return RuleTrigger * @return RuleTrigger
*/ */
public function storeTrigger(Rule $rule, $action, $value, $stopProcessing, $order); public function storeTrigger(Rule $rule, $action, $value, $stopProcessing, $order);
/** /**
* @param Rule $rule * @param Rule $rule
* @param string $action * @param string $action
* @param string $value * @param string $value
* @param bool $stopProcessing * @param bool $stopProcessing
* @param int $order * @param int $order
* *
* @return RuleAction * @return RuleAction
*/ */

View File

@@ -10,10 +10,12 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
use Log;
use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Translation\TranslatorInterface;
/** /**
@@ -45,22 +47,29 @@ class FireflyValidator extends Validator
*/ */
public function validateRuleTriggerValue($attribute, $value, $parameters) public function validateRuleTriggerValue($attribute, $value, $parameters)
{ {
// get the index from a string like "rule-trigger-value.2".
$parts = explode('.', $attribute);
$index = $parts[count($parts) - 1];
// loop all rule-triggers. // loop all rule-triggers.
// check if rule-value matches the thing. // check if rule-value matches the thing.
if (is_array($this->data['rule-trigger'])) { if (is_array($this->data['rule-trigger'])) {
foreach ($this->data['rule-trigger'] as $index => $name) { $name = isset($this->data['rule-trigger'][$index]) ? $this->data['rule-trigger'][$index] : 'invalid';
$value = isset($this->data['rule-trigger-value'][$index]) ? $this->data['rule-trigger-value'][$index] : false; $value = isset($this->data['rule-trigger-value'][$index]) ? $this->data['rule-trigger-value'][$index] : false;
switch ($name) { switch ($name) {
default: default:
return true; return true;
case 'amount_less': case 'amount_less':
return is_numeric($value); return is_numeric($value);
break; break;
case 'transaction_type': case 'transaction_type':
echo 'Implement me!'; $count = TransactionType::where('type', $value)->count();
exit;
break; return $count === 1;
} break;
case 'invalid':
return false;
break;
} }
} }
} }
@@ -74,27 +83,35 @@ class FireflyValidator extends Validator
*/ */
public function validateRuleActionValue($attribute, $value, $parameters) public function validateRuleActionValue($attribute, $value, $parameters)
{ {
// get the index from a string like "rule-action-value.2".
$parts = explode('.', $attribute);
$index = $parts[count($parts) - 1];
// loop all rule-actions. // loop all rule-actions.
// check if rule-action-value matches the thing. // check if rule-action-value matches the thing.
if (is_array($this->data['rule-action'])) {
foreach ($this->data['rule-action'] as $index => $name) {
$value = isset($this->data['rule-action-value'][$index]) ? $this->data['rule-action-value'][$index] : false;
switch ($name) {
default:
return true;
case 'set_budget':
/** @var BudgetRepositoryInterface $repository */
$repository = app('FireflyIII\Repositories\Budget\BudgetRepositoryInterface');
$budgets = $repository->getBudgets();
// count budgets, should have at least one
$count = $budgets->filter(
function (Budget $budget) use ($value) {
return $budget->name == $value;
}
)->count();
return ($count === 1); if (is_array($this->data['rule-action'])) {
} $name = isset($this->data['rule-action'][$index]) ? $this->data['rule-action'][$index] : 'invalid';
$value = isset($this->data['rule-action-value'][$index]) ? $this->data['rule-action-value'][$index] : false;
switch ($name) {
default:
Log::debug(' (' . $attribute . ') (index:' . $index . ') Name is "' . $name . '" so no action is taken.');
return true;
case 'set_budget':
/** @var BudgetRepositoryInterface $repository */
$repository = app('FireflyIII\Repositories\Budget\BudgetRepositoryInterface');
$budgets = $repository->getBudgets();
// count budgets, should have at least one
$count = $budgets->filter(
function (Budget $budget) use ($value) {
return $budget->name == $value;
}
)->count();
return ($count === 1);
case 'invalid':
return false;
} }
} }

View File

@@ -62,9 +62,11 @@ return [
'save_rules_by_moving' => 'Save these rule(s) by moving them to another rule group:', 'save_rules_by_moving' => 'Save these rule(s) by moving them to another rule group:',
'make_new_rule' => 'Make new rule in rule group ":title"', 'make_new_rule' => 'Make new rule in rule group ":title"',
'rule_help_stop_processing' => 'When you check this box, later rules in this group will not be executed.', 'rule_help_stop_processing' => 'When you check this box, later rules in this group will not be executed.',
'rule_help_active' => 'Inactive rules will never fire.',
'stored_new_rule' => 'Stored new rule with title ":title"', 'stored_new_rule' => 'Stored new rule with title ":title"',
'deleted_rule' => 'Deleted rule with title ":title"', 'deleted_rule' => 'Deleted rule with title ":title"',
'store_new_rule' => 'Store new rule', 'store_new_rule' => 'Store new rule',
'updated_rule' => 'Updated rule with title ":title"',
'trigger' => 'Trigger', 'trigger' => 'Trigger',
'trigger_value' => 'Trigger on value', 'trigger_value' => 'Trigger on value',

View File

@@ -6,6 +6,7 @@
{% block content %} {% block content %}
{{ Form.model(rule, {'class' : 'form-horizontal','id' : 'store','url' : route('rules.rule.update', rule.id)}) }} {{ Form.model(rule, {'class' : 'form-horizontal','id' : 'store','url' : route('rules.rule.update', rule.id)}) }}
<input type="hidden" name="rule_group_id" value="{{ rule.rule_group_id }}"/>
<div class="row"> <div class="row">
<div class="col-lg-6 col-md-6 col-sm-12"> <div class="col-lg-6 col-md-6 col-sm-12">
<div class="box box-primary"> <div class="box box-primary">
@@ -15,6 +16,7 @@
<div class="box-body"> <div class="box-body">
{{ ExpandedForm.text('title') }} {{ ExpandedForm.text('title') }}
{{ ExpandedForm.select('trigger',allJournalTriggers(), primaryTrigger) }} {{ ExpandedForm.select('trigger',allJournalTriggers(), primaryTrigger) }}
{{ ExpandedForm.checkbox('active',1,rule.active, {helpText: trans('firefly.rule_help_active')}) }}
{{ ExpandedForm.checkbox('stop_processing',1,rule.stop_processing, {helpText: trans('firefly.rule_help_stop_processing')}) }} {{ ExpandedForm.checkbox('stop_processing',1,rule.stop_processing, {helpText: trans('firefly.rule_help_stop_processing')}) }}
</div> </div>
</div> </div>