diff --git a/app/Api/V1/Controllers/TransactionController.php b/app/Api/V1/Controllers/TransactionController.php index 728e3f0e8b..289cc0a39f 100644 --- a/app/Api/V1/Controllers/TransactionController.php +++ b/app/Api/V1/Controllers/TransactionController.php @@ -297,7 +297,7 @@ class TransactionController extends Controller return response()->json($response, 422); } app('preferences')->mark(); - event(new StoredTransactionGroup($transactionGroup)); + event(new StoredTransactionGroup($transactionGroup, $data['apply_rules'] ?? true)); $manager = $this->getManager(); /** @var User $admin */ @@ -341,7 +341,7 @@ class TransactionController extends Controller $manager = $this->getManager(); app('preferences')->mark(); - event(new UpdatedTransactionGroup($transactionGroup)); + event(new UpdatedTransactionGroup($transactionGroup, $data['apply_rules'] ?? true)); /** @var User $admin */ $admin = auth()->user(); diff --git a/app/Api/V1/Requests/TransactionStoreRequest.php b/app/Api/V1/Requests/TransactionStoreRequest.php index faec8e3c62..3b9319dd51 100644 --- a/app/Api/V1/Requests/TransactionStoreRequest.php +++ b/app/Api/V1/Requests/TransactionStoreRequest.php @@ -47,6 +47,7 @@ class TransactionStoreRequest extends Request public function authorize(): bool { Log::debug('Authorize TransactionStoreRequest'); + // Only allow authenticated users return auth()->check(); } @@ -62,6 +63,7 @@ class TransactionStoreRequest extends Request $data = [ 'group_title' => $this->string('group_title'), 'error_if_duplicate_hash' => $this->boolean('error_if_duplicate_hash'), + 'apply_rules' => $this->boolean('apply_rules', true), 'transactions' => $this->getTransactionData(), ]; @@ -80,6 +82,7 @@ class TransactionStoreRequest extends Request // basic fields for group: 'group_title' => 'between:1,1000|nullable', 'error_if_duplicate_hash' => [new IsBoolean], + 'apply_rules' => [new IsBoolean], // transaction rules (in array for splits): 'transactions.*.type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation', diff --git a/app/Api/V1/Requests/TransactionUpdateRequest.php b/app/Api/V1/Requests/TransactionUpdateRequest.php index 764570a570..422032ba3e 100644 --- a/app/Api/V1/Requests/TransactionUpdateRequest.php +++ b/app/Api/V1/Requests/TransactionUpdateRequest.php @@ -138,6 +138,7 @@ class TransactionUpdateRequest extends Request $data = [ 'transactions' => $this->getTransactionData(), + 'apply_rules' => $this->boolean('apply_rules', true), ]; if ($this->has('group_title')) { $data['group_title'] = $this->string('group_title'); @@ -156,6 +157,7 @@ class TransactionUpdateRequest extends Request $rules = [ // basic fields for group: 'group_title' => 'between:1,1000', + 'apply_rules' => [new IsBoolean], // transaction rules (in array for splits): 'transactions.*.type' => 'in:withdrawal,deposit,transfer,opening-balance,reconciliation', diff --git a/app/Events/StoredTransactionGroup.php b/app/Events/StoredTransactionGroup.php index 701733b184..13e9341eb3 100644 --- a/app/Events/StoredTransactionGroup.php +++ b/app/Events/StoredTransactionGroup.php @@ -36,6 +36,7 @@ class StoredTransactionGroup extends Event { use SerializesModels; + /** @var bool */ public $applyRules; /** @var TransactionGroup The group that was stored. */ public $transactionGroup; diff --git a/app/Events/UpdatedTransactionGroup.php b/app/Events/UpdatedTransactionGroup.php index 1ab814ec14..cd1ded0b2c 100644 --- a/app/Events/UpdatedTransactionGroup.php +++ b/app/Events/UpdatedTransactionGroup.php @@ -37,6 +37,8 @@ class UpdatedTransactionGroup extends Event { use SerializesModels; + /** @var bool */ + public $applyRules; /** @var TransactionGroup The group that was stored. */ public $transactionGroup; @@ -45,8 +47,9 @@ class UpdatedTransactionGroup extends Event * * @param TransactionGroup $transactionGroup */ - public function __construct(TransactionGroup $transactionGroup) + public function __construct(TransactionGroup $transactionGroup, bool $applyRules = true) { $this->transactionGroup = $transactionGroup; + $this->applyRules = $applyRules; } } diff --git a/app/Handlers/Events/StoredGroupEventHandler.php b/app/Handlers/Events/StoredGroupEventHandler.php index 77b3a3c960..60a0ad99a2 100644 --- a/app/Handlers/Events/StoredGroupEventHandler.php +++ b/app/Handlers/Events/StoredGroupEventHandler.php @@ -35,21 +35,23 @@ class StoredGroupEventHandler /** * This method grabs all the users rules and processes them. * - * @param StoredTransactionGroup $storedJournalEvent + * @param StoredTransactionGroup $storedGroupEvent */ - public function processRules(StoredTransactionGroup $storedJournalEvent): void + public function processRules(StoredTransactionGroup $storedGroupEvent): void { - if (false === $storedJournalEvent->applyRules) { + if (false === $storedGroupEvent->applyRules) { + Log::info(sprintf('Will not run rules on group #%d', $storedGroupEvent->transactionGroup->id)); + return; } Log::debug('Now in StoredGroupEventHandler::processRules()'); /** @var RuleEngine $ruleEngine */ $ruleEngine = app(RuleEngine::class); - $ruleEngine->setUser($storedJournalEvent->transactionGroup->user); + $ruleEngine->setUser($storedGroupEvent->transactionGroup->user); $ruleEngine->setAllRules(true); $ruleEngine->setTriggerMode(RuleEngine::TRIGGER_STORE); - $journals = $storedJournalEvent->transactionGroup->transactionJournals; + $journals = $storedGroupEvent->transactionGroup->transactionJournals; /** @var TransactionJournal $journal */ foreach ($journals as $journal) { diff --git a/app/Handlers/Events/UpdatedGroupEventHandler.php b/app/Handlers/Events/UpdatedGroupEventHandler.php index 96b6025091..f478f9983e 100644 --- a/app/Handlers/Events/UpdatedGroupEventHandler.php +++ b/app/Handlers/Events/UpdatedGroupEventHandler.php @@ -35,16 +35,22 @@ class UpdatedGroupEventHandler /** * This method will check all the rules when a journal is updated. * - * @param UpdatedTransactionGroup $updatedJournalEvent + * @param UpdatedTransactionGroup $updatedGroupEvent */ - public function processRules(UpdatedTransactionGroup $updatedJournalEvent): void + public function processRules(UpdatedTransactionGroup $updatedGroupEvent): void { + if (false === $updatedGroupEvent->applyRules) { + Log::info(sprintf('Will not run rules on group #%d', $updatedGroupEvent->transactionGroup->id)); + + return; + } + /** @var RuleEngine $ruleEngine */ $ruleEngine = app(RuleEngine::class); - $ruleEngine->setUser($updatedJournalEvent->transactionGroup->user); + $ruleEngine->setUser($updatedGroupEvent->transactionGroup->user); $ruleEngine->setAllRules(true); $ruleEngine->setTriggerMode(RuleEngine::TRIGGER_UPDATE); - $journals = $updatedJournalEvent->transactionGroup->transactionJournals; + $journals = $updatedGroupEvent->transactionGroup->transactionJournals; /** @var TransactionJournal $journal */ foreach ($journals as $journal) {