diff --git a/app/Api/V1/Controllers/Models/Transaction/StoreController.php b/app/Api/V1/Controllers/Models/Transaction/StoreController.php index 51f15f5b25..a93ae6f5ba 100644 --- a/app/Api/V1/Controllers/Models/Transaction/StoreController.php +++ b/app/Api/V1/Controllers/Models/Transaction/StoreController.php @@ -27,14 +27,11 @@ namespace FireflyIII\Api\V1\Controllers\Models\Transaction; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Models\Transaction\StoreRequest; use FireflyIII\Enums\UserRoleEnum; -use FireflyIII\Events\Model\TransactionGroup\CreatedSingleTransactionGroup; -use FireflyIII\Events\Model\TransactionGroup\TransactionGroupEventFlags; use FireflyIII\Exceptions\DuplicateTransactionException; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Rules\IsDuplicateTransaction; -use FireflyIII\Support\Facades\Preferences; use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; use FireflyIII\Transformers\TransactionGroupTransformer; @@ -88,9 +85,9 @@ class StoreController extends Controller public function store(StoreRequest $request): JsonResponse { Log::debug('Now in API StoreController::store()'); - $data = $request->getAll(); - $data['user'] = auth()->user(); - $data['user_group'] = $this->userGroup; + $data = $request->getAll(); + $data['user'] = auth()->user(); + $data['user_group'] = $this->userGroup; Log::channel('audit')->info('Store new transaction over API.', $data); @@ -110,14 +107,14 @@ class StoreController extends Controller throw new ValidationException($validator); } - $manager = $this->getManager(); + $manager = $this->getManager(); /** @var User $admin */ - $admin = auth()->user(); + $admin = auth()->user(); // use new group collector: /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); + $collector = app(GroupCollectorInterface::class); $collector ->setUser($admin) ->setUserGroup($this->userGroup) @@ -127,20 +124,20 @@ class StoreController extends Controller ->withAPIInformation() ; - $selectedGroup = $collector->getGroups()->first(); + $selectedGroup = $collector->getGroups()->first(); if (null === $selectedGroup) { throw HttpException::fromStatusCode(410, '200032: Cannot find transaction. Possibly, a rule deleted this transaction after its creation.'); } // enrich - $enrichment = new TransactionGroupEnrichment(); + $enrichment = new TransactionGroupEnrichment(); $enrichment->setUser($admin); - $selectedGroup = $enrichment->enrichSingle($selectedGroup); + $selectedGroup = $enrichment->enrichSingle($selectedGroup); /** @var TransactionGroupTransformer $transformer */ - $transformer = app(TransactionGroupTransformer::class); + $transformer = app(TransactionGroupTransformer::class); $transformer->setParameters($this->parameters); - $resource = new Item($selectedGroup, $transformer, 'transactions'); + $resource = new Item($selectedGroup, $transformer, 'transactions'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } diff --git a/app/Events/Model/TransactionGroup/CreatedSingleTransactionGroup.php b/app/Events/Model/TransactionGroup/CreatedSingleTransactionGroup.php index f668553243..95288fa8ef 100644 --- a/app/Events/Model/TransactionGroup/CreatedSingleTransactionGroup.php +++ b/app/Events/Model/TransactionGroup/CreatedSingleTransactionGroup.php @@ -25,7 +25,6 @@ declare(strict_types=1); namespace FireflyIII\Events\Model\TransactionGroup; use FireflyIII\Events\Event; -use FireflyIII\Models\TransactionGroup; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; diff --git a/app/Events/Model/TransactionGroup/TransactionGroupEventObjects.php b/app/Events/Model/TransactionGroup/TransactionGroupEventObjects.php index bda0de7bff..68df55f129 100644 --- a/app/Events/Model/TransactionGroup/TransactionGroupEventObjects.php +++ b/app/Events/Model/TransactionGroup/TransactionGroupEventObjects.php @@ -1,8 +1,9 @@ accounts = new Collection(); - $this->budgets = new Collection(); - $this->categories = new Collection(); - $this->tags =new Collection(); + public function __construct() + { + $this->accounts = new Collection(); + $this->budgets = new Collection(); + $this->categories = new Collection(); + $this->tags = new Collection(); $this->transactionJournals = new Collection(); } public static function collectFromTransactionGroup(TransactionGroup $transactionGroup): self { - $object = new self; + $object = new self(); + /** @var TransactionJournal $journal */ - foreach($transactionGroup->transactionJournals as $journal) { + foreach ($transactionGroup->transactionJournals as $journal) { $object->transactionJournals->push($journal); - $object->budgets = $object->tags->merge($journal->budgets); + $object->budgets = $object->tags->merge($journal->budgets); $object->categories = $object->tags->merge($journal->categories); - $object->tags = $object->tags->merge($journal->tags); + $object->tags = $object->tags->merge($journal->tags); /** @var Transaction $transaction */ - foreach($journal->transactions as $transaction) { + foreach ($journal->transactions as $transaction) { $object->accounts->push($transaction->account); } } + return $object; } } diff --git a/app/Http/Controllers/Transaction/CreateController.php b/app/Http/Controllers/Transaction/CreateController.php index f66cf31f8d..278051c120 100644 --- a/app/Http/Controllers/Transaction/CreateController.php +++ b/app/Http/Controllers/Transaction/CreateController.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; -use FireflyIII\Events\Model\TransactionGroup\CreatedSingleTransactionGroup; -use FireflyIII\Events\Model\TransactionGroup\TransactionGroupEventFlags; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\TransactionGroup; use FireflyIII\Repositories\Account\AccountRepositoryInterface; diff --git a/app/Jobs/CreateRecurringTransactions.php b/app/Jobs/CreateRecurringTransactions.php index 489a5777ea..a8a770aa24 100644 --- a/app/Jobs/CreateRecurringTransactions.php +++ b/app/Jobs/CreateRecurringTransactions.php @@ -25,8 +25,6 @@ declare(strict_types=1); namespace FireflyIII\Jobs; use Carbon\Carbon; -use FireflyIII\Events\Model\TransactionGroup\CreatedSingleTransactionGroup; -use FireflyIII\Events\Model\TransactionGroup\TransactionGroupEventFlags; use FireflyIII\Events\Model\TransactionGroup\TransactionGroupsRequestedReporting; use FireflyIII\Exceptions\DuplicateTransactionException; use FireflyIII\Exceptions\FireflyException; @@ -336,7 +334,7 @@ class CreateRecurringTransactions implements ShouldQueue Log::debug(sprintf('%s IS today (%s)', $date->format('Y-m-d'), $this->date->format('Y-m-d'))); // count created journals on THIS day. - $journalCount = $this->repository->getJournalCount($recurrence, $date, $date); + $journalCount = $this->repository->getJournalCount($recurrence, $date, $date); if ($journalCount > 0 && false === $this->force) { Log::info(sprintf('Already created %d journal(s) for date %s', $journalCount, $date->format('Y-m-d'))); @@ -354,11 +352,11 @@ class CreateRecurringTransactions implements ShouldQueue } // create transaction array and send to factory. - $groupTitle = null; - $count = $recurrence->recurrenceTransactions->count(); + $groupTitle = null; + $count = $recurrence->recurrenceTransactions->count(); // #8844, if there is one recurrence transaction, use the first title as the title. // #9305, if there is one recurrence transaction, group title must be NULL. - $groupTitle = null; + $groupTitle = null; // #8844, if there are more, use the recurrence transaction itself. if ($count > 1) { @@ -371,7 +369,7 @@ class CreateRecurringTransactions implements ShouldQueue return null; } - $array = [ + $array = [ 'user' => $recurrence->user, 'user_group' => $recurrence->user->userGroup, 'group_title' => $groupTitle, @@ -379,7 +377,7 @@ class CreateRecurringTransactions implements ShouldQueue ]; /** @var TransactionGroup $group */ - $group = $this->groupRepository->store($array); + $group = $this->groupRepository->store($array); ++$this->created; Log::info(sprintf('Created new transaction group #%d', $group->id)); $this->groups->push($group); diff --git a/app/Listeners/Model/TransactionGroup/ProcessesNewTransactionGroup.php b/app/Listeners/Model/TransactionGroup/ProcessesNewTransactionGroup.php index ec696fd917..bcc33d4e2d 100644 --- a/app/Listeners/Model/TransactionGroup/ProcessesNewTransactionGroup.php +++ b/app/Listeners/Model/TransactionGroup/ProcessesNewTransactionGroup.php @@ -24,31 +24,18 @@ declare(strict_types=1); namespace FireflyIII\Listeners\Model\TransactionGroup; -use Carbon\Carbon; use FireflyIII\Enums\WebhookTrigger; use FireflyIII\Events\Model\TransactionGroup\CreatedSingleTransactionGroup; -use FireflyIII\Events\Model\TransactionGroup\TransactionGroupEventObjects; use FireflyIII\Events\Model\TransactionGroup\UserRequestedBatchProcessing; -use FireflyIII\Events\Model\Webhook\WebhookMessagesRequestSending; -use FireflyIII\Generator\Webhook\MessageGeneratorInterface; -use FireflyIII\Models\Account; -use FireflyIII\Models\TransactionGroup; -use FireflyIII\Models\TransactionJournal; -use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Repositories\PeriodStatistic\PeriodStatisticRepositoryInterface; -use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; -use FireflyIII\Services\Internal\Support\CreditRecalculateService; use FireflyIII\Support\Facades\FireflyConfig; -use FireflyIII\Support\Models\AccountBalanceCalculator; -use FireflyIII\TransactionRules\Engine\RuleEngineInterface; use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; class ProcessesNewTransactionGroup implements ShouldQueue { use SupportsGroupProcessingTrait; + public function handle(CreatedSingleTransactionGroup|UserRequestedBatchProcessing $event): void { Log::debug(sprintf('User called %s', get_class($event))); @@ -61,7 +48,7 @@ class ProcessesNewTransactionGroup implements ShouldQueue } Log::debug('Will also collect all open transaction groups and process them.'); $repository = app(JournalRepositoryInterface::class); - $journals = $event->objects->transactionJournals->merge($repository->getAllUncompletedJournals()); + $journals = $event->objects->transactionJournals->merge($repository->getAllUncompletedJournals()); Log::debug(sprintf('Transaction journal count is %d', $journals->count())); if (!$event->flags->applyRules) { @@ -75,7 +62,7 @@ class ProcessesNewTransactionGroup implements ShouldQueue } if ($event->flags->applyRules) { - $this->processRules($journals,'store-journal'); + $this->processRules($journals, 'store-journal'); } if ($event->flags->recalculateCredit) { $this->recalculateCredit($event->objects->accounts); diff --git a/app/Listeners/Model/TransactionGroup/SupportsGroupProcessingTrait.php b/app/Listeners/Model/TransactionGroup/SupportsGroupProcessingTrait.php index 7c85f6e708..a1f56a82b3 100644 --- a/app/Listeners/Model/TransactionGroup/SupportsGroupProcessingTrait.php +++ b/app/Listeners/Model/TransactionGroup/SupportsGroupProcessingTrait.php @@ -1,14 +1,14 @@ deleteStatisticsForCollection($set->transactionJournals); + // FIXME extend for categories, accounts, etc. } } - protected function processRules(Collection $set, string $type): void { Log::debug(sprintf('Will now processRules("%s") for %d journal(s)', $type, $set->count())); diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepository.php b/app/Repositories/TransactionGroup/TransactionGroupRepository.php index 7ba764a249..6f56d4a5c5 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepository.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepository.php @@ -396,7 +396,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface, public function store(array $data): TransactionGroup { /** @var TransactionGroupFactory $factory */ - $factory = app(TransactionGroupFactory::class); + $factory = app(TransactionGroupFactory::class); $factory->setUser($data['user']); $factory->setUserGroup($data['user_group']); @@ -415,7 +415,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface, } Preferences::mark(); - $objects = TransactionGroupEventObjects::collectFromTransactionGroup($transactionGroup); + $objects = TransactionGroupEventObjects::collectFromTransactionGroup($transactionGroup); $flags = new TransactionGroupEventFlags(); $flags->applyRules = $data['apply_rules'] ?? true; $flags->fireWebhooks = $data['fire_webhooks'] ?? true; @@ -424,6 +424,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface, event(new CreatedSingleTransactionGroup($flags, $objects)); Log::debug(sprintf('send event WebhookMessagesRequestSending from %s', __METHOD__)); event(new WebhookMessagesRequestSending()); + return $transactionGroup; } diff --git a/app/Services/Internal/Support/CreditRecalculateService.php b/app/Services/Internal/Support/CreditRecalculateService.php index 01d8a4ef54..000c3ef335 100644 --- a/app/Services/Internal/Support/CreditRecalculateService.php +++ b/app/Services/Internal/Support/CreditRecalculateService.php @@ -67,7 +67,7 @@ class CreditRecalculateService // work based on account. $this->processAccount(); } - if($this->accounts->count() > 0) { + if ($this->accounts->count() > 0) { $this->processAccounts(); } if ($this->journals->count() > 0) { @@ -502,8 +502,9 @@ class CreditRecalculateService private function processAccounts(): void { $valid = config('firefly.valid_liabilities'); + /** @var Account $account */ - foreach($this->accounts as $account) { + foreach ($this->accounts as $account) { if (in_array($account->accountType->type, $valid, true)) { $this->work[] = $account; } @@ -514,6 +515,4 @@ class CreditRecalculateService { $this->accounts = $accounts; } - - } diff --git a/app/Services/Internal/Update/GroupCloneService.php b/app/Services/Internal/Update/GroupCloneService.php index 54540afc4a..2555dbf01f 100644 --- a/app/Services/Internal/Update/GroupCloneService.php +++ b/app/Services/Internal/Update/GroupCloneService.php @@ -55,7 +55,7 @@ class GroupCloneService // event! $flags = new TransactionGroupEventFlags(); - $objects = TransactionGroupEventObjects::collectFromTransactionGroup($newGroup); + $objects = TransactionGroupEventObjects::collectFromTransactionGroup($newGroup); event(new CreatedSingleTransactionGroup($flags, $objects)); Log::debug(sprintf('send event WebhookMessagesRequestSending from %s', __METHOD__)); diff --git a/composer.lock b/composer.lock index 92e2a1324e..013769b054 100644 --- a/composer.lock +++ b/composer.lock @@ -10530,16 +10530,16 @@ }, { "name": "fruitcake/laravel-debugbar", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/fruitcake/laravel-debugbar.git", - "reference": "1da86437d28f36baf3bb9841d77e74cb639372a9" + "reference": "0cbf2986de59f66870cee565491b81eb89f8d25e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/1da86437d28f36baf3bb9841d77e74cb639372a9", - "reference": "1da86437d28f36baf3bb9841d77e74cb639372a9", + "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/0cbf2986de59f66870cee565491b81eb89f8d25e", + "reference": "0cbf2986de59f66870cee565491b81eb89f8d25e", "shasum": "" }, "require": { @@ -10616,7 +10616,7 @@ ], "support": { "issues": "https://github.com/fruitcake/laravel-debugbar/issues", - "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.0.5" + "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.0.6" }, "funding": [ { @@ -10628,7 +10628,7 @@ "type": "github" } ], - "time": "2026-01-29T19:18:02+00:00" + "time": "2026-02-04T11:48:53+00:00" }, { "name": "hamcrest/hamcrest-php", diff --git a/config/firefly.php b/config/firefly.php index 6e748f4e65..46f2d1bb10 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -79,7 +79,7 @@ return [ // see cer.php for exchange rates feature flag. ], 'version' => 'develop/2026-02-04', - 'build_time' => 1770188659, + 'build_time' => 1770218409, 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 28, // field is no longer used.