Implemented controller method and helper object to find matching transactions

This commit is contained in:
Robert Horlings
2016-02-17 12:05:41 +01:00
parent b9620b3a21
commit c8c69f1a66
6 changed files with 247 additions and 1 deletions

View File

@@ -25,6 +25,7 @@ use Response;
use Session;
use URL;
use View;
use FireflyIII\Rules\TransactionMatcher;
/**
* Class RuleController
@@ -333,6 +334,74 @@ class RuleController extends Controller
return redirect(session('rules.rule.edit.url'));
}
/**
* @return \Illuminate\View\View
*/
public function testTriggers() {
// Create a list of triggers
$triggers = $this->getTriggerList();
// We start searching for transactions. For performance reasons, there are limits
// to the search: a maximum number of results and a maximum number of transactions
// to search in
// TODO: Make these values configurable
$maxResults = 50;
$maxTransactionsToSearchIn = 1000;
// Dispatch the actual work to a matched object
$matchingTransactions =
(new TransactionMatcher($triggers))
->setTransactionLimit($maxTransactionsToSearchIn)
->findMatchingTransactions($maxResults);
// Warn the user if only a subset of transactions is returned
if(count( $matchingTransactions ) == $maxResults) {
$warning = trans('firefly.warning_transaction_subset', [ 'max_num_transactions' => $maxResults ] );
} else if(count($matchingTransactions) == 0){
$warning = trans('firefly.warning_no_matching_transactions', [ 'num_transactions' => $maxTransactionsToSearchIn ] );
} else {
$warning = "";
}
// Return json response
$view = view('list.journals-tiny', [ 'transactions' => $matchingTransactions ])->render();
return Response::json(['html' => $view, 'warning' => $warning ]);
}
/**
* Returns a list of triggers as provided in the URL
* @return array
*/
protected function getTriggerList() {
$triggers = [];
$order = 1;
$data = [
'rule-triggers' => Input::get('rule-trigger'),
'rule-trigger-values' => Input::get('rule-trigger-value'),
'rule-trigger-stop' => Input::get('rule-trigger-stop'),
];
foreach ($data['rule-triggers'] as $index => $trigger) {
$value = $data['rule-trigger-values'][$index];
$stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false;
// Create a new trigger object
$ruleTrigger = new RuleTrigger;
$ruleTrigger->order = $order;
$ruleTrigger->active = 1;
$ruleTrigger->stop_processing = $stopProcessing;
$ruleTrigger->trigger_type = $trigger;
$ruleTrigger->trigger_value = $value;
// Store in list
$triggers[] = $ruleTrigger;
$order++;
}
return $triggers;
}
private function createDefaultRule()
{
/** @var RuleRepositoryInterface $repository */

View File

@@ -272,7 +272,8 @@ Route::group(
Route::get('/rules/rules/down/{rule}', ['uses' => 'RuleController@down', 'as' => 'rules.rule.down']);
Route::get('/rules/rules/edit/{rule}', ['uses' => 'RuleController@edit', 'as' => 'rules.rule.edit']);
Route::get('/rules/rules/delete/{rule}', ['uses' => 'RuleController@delete', 'as' => 'rules.rule.delete']);
Route::get('/rules/rules/test_triggers', ['uses' => 'RuleController@testTriggers', 'as' => 'rules.rule.test_triggers']);
// rules POST:
Route::post('/rules/rules/trigger/reorder/{rule}', ['uses' => 'RuleController@reorderRuleTriggers']);
Route::post('/rules/rules/action/reorder/{rule}', ['uses' => 'RuleController@reorderRuleActions']);