mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-11-03 20:55:05 +00:00 
			
		
		
		
	Compare commits
	
		
			14 Commits
		
	
	
		
			develop-20
			...
			develop-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					fe926ae23e | ||
| 
						 | 
					2852a36712 | ||
| 
						 | 
					7743d16ea1 | ||
| 
						 | 
					ae767fc90d | ||
| 
						 | 
					b49575db8b | ||
| 
						 | 
					69b816d957 | ||
| 
						 | 
					e9cf5111c9 | ||
| 
						 | 
					a57cf4e9be | ||
| 
						 | 
					d5e431c3a1 | ||
| 
						 | 
					ffe0f39f6a | ||
| 
						 | 
					e99a37bae3 | ||
| 
						 | 
					27336e0721 | ||
| 
						 | 
					c20c804f9a | ||
| 
						 | 
					ddd94276db | 
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Controllers\Controller;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteTransactionApiRequest;
 | 
			
		||||
use FireflyIII\Enums\UserRoleEnum;
 | 
			
		||||
use FireflyIII\Models\TransactionGroup;
 | 
			
		||||
use FireflyIII\Models\TransactionJournal;
 | 
			
		||||
@@ -64,7 +65,7 @@ class TransactionController extends Controller
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function transactions(AutocompleteApiRequest $request): JsonResponse
 | 
			
		||||
    public function transactions(AutocompleteTransactionApiRequest $request): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        $result   = $this->repository->searchJournalDescriptions($request->attributes->get('query'), $request->attributes->get('limit'));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Api\V1\Controllers\Models\Account;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Controllers\Controller;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
 | 
			
		||||
use FireflyIII\Models\Account;
 | 
			
		||||
@@ -37,7 +38,6 @@ use FireflyIII\Transformers\PiggyBankTransformer;
 | 
			
		||||
use FireflyIII\Transformers\TransactionGroupTransformer;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Http\JsonResponse;
 | 
			
		||||
use Illuminate\Http\Request;
 | 
			
		||||
use Illuminate\Pagination\LengthAwarePaginator;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 | 
			
		||||
@@ -110,7 +110,7 @@ class ListController extends Controller
 | 
			
		||||
        // get list of piggy banks. Count it and split it.
 | 
			
		||||
        $collection  = $this->repository->getPiggyBanks($account);
 | 
			
		||||
        $count       = $collection->count();
 | 
			
		||||
        $piggyBanks  = $collection->slice(($page - 1) * $limit, $limit);
 | 
			
		||||
        $piggyBanks  = $collection->slice($offset, $limit);
 | 
			
		||||
 | 
			
		||||
        // enrich
 | 
			
		||||
        /** @var User $admin */
 | 
			
		||||
@@ -136,12 +136,15 @@ class ListController extends Controller
 | 
			
		||||
    /**
 | 
			
		||||
     * Show all transaction groups related to the account.
 | 
			
		||||
     */
 | 
			
		||||
    public function transactions(Request $request, Account $account): JsonResponse
 | 
			
		||||
    public function transactions(PaginationDateRangeRequest $request, Account $account): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        $pageSize     = $this->parameters->get('limit');
 | 
			
		||||
        $type         = $request->get('type') ?? 'default';
 | 
			
		||||
        $this->parameters->set('type', $type);
 | 
			
		||||
        $types        = $this->mapTransactionTypes($this->parameters->get('type'));
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
            'start'  => $start,
 | 
			
		||||
            'end'    => $end,
 | 
			
		||||
            'types'  => $types,
 | 
			
		||||
        ]             = $request->attributes->all();
 | 
			
		||||
        $manager      = $this->getManager();
 | 
			
		||||
 | 
			
		||||
        /** @var User $admin */
 | 
			
		||||
@@ -150,15 +153,12 @@ class ListController extends Controller
 | 
			
		||||
        // use new group collector:
 | 
			
		||||
        /** @var GroupCollectorInterface $collector */
 | 
			
		||||
        $collector    = app(GroupCollectorInterface::class);
 | 
			
		||||
        $collector->setUser($admin)->setAccounts(new Collection()->push($account))
 | 
			
		||||
            ->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types)
 | 
			
		||||
        ;
 | 
			
		||||
 | 
			
		||||
        if (null !== $this->parameters->get('start')) {
 | 
			
		||||
            $collector->setStart($this->parameters->get('start'));
 | 
			
		||||
        $collector->setUser($admin)->setAccounts(new Collection()->push($account))->withAPIInformation()->setLimit($limit)->setPage($page)->setTypes($types);
 | 
			
		||||
        if (null !== $start) {
 | 
			
		||||
            $collector->setStart($start);
 | 
			
		||||
        }
 | 
			
		||||
        if (null !== $this->parameters->get('end')) {
 | 
			
		||||
            $collector->setEnd($this->parameters->get('end'));
 | 
			
		||||
        if (null !== $end) {
 | 
			
		||||
            $collector->setEnd($end);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $paginator    = $collector->getPaginatedGroups();
 | 
			
		||||
@@ -171,7 +171,6 @@ class ListController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var TransactionGroupTransformer $transformer */
 | 
			
		||||
        $transformer  = app(TransactionGroupTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource     = new FractalCollection($transactions, $transformer, 'transactions');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,6 @@ class StoreController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var AccountTransformer $transformer */
 | 
			
		||||
        $transformer = app(AccountTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new Item($account, $transformer, self::RESOURCE_KEY);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,6 @@ class UpdateController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var AccountTransformer $transformer */
 | 
			
		||||
        $transformer  = app(AccountTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
        $resource     = new Item($account, $transformer, self::RESOURCE_KEY);
 | 
			
		||||
 | 
			
		||||
        return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Attachment;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Controllers\Controller;
 | 
			
		||||
use FireflyIII\Api\V1\Middleware\ApiDemoUser;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Models\Attachment;
 | 
			
		||||
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
 | 
			
		||||
@@ -120,8 +121,14 @@ class ShowController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * Display a listing of the resource.
 | 
			
		||||
     */
 | 
			
		||||
    public function index(): JsonResponse
 | 
			
		||||
    public function index(PaginationRequest $request): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'offset' => $offset,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
        ]            = $request->attributes->all();
 | 
			
		||||
 | 
			
		||||
        if (true === auth()->user()->hasRole('demo')) {
 | 
			
		||||
            Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
@@ -130,21 +137,17 @@ class ShowController extends Controller
 | 
			
		||||
 | 
			
		||||
        $manager     = $this->getManager();
 | 
			
		||||
 | 
			
		||||
        // types to get, page size:
 | 
			
		||||
        $pageSize    = $this->parameters->get('limit');
 | 
			
		||||
 | 
			
		||||
        // get list of attachments. Count it and split it.
 | 
			
		||||
        $collection  = $this->repository->get();
 | 
			
		||||
        $count       = $collection->count();
 | 
			
		||||
        $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
 | 
			
		||||
        $attachments = $collection->slice($offset, $limit);
 | 
			
		||||
 | 
			
		||||
        // make paginator:
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($attachments, $count, $limit, $page);
 | 
			
		||||
        $paginator->setPath(route('api.v1.attachments.index').$this->buildParams());
 | 
			
		||||
 | 
			
		||||
        /** @var AttachmentTransformer $transformer */
 | 
			
		||||
        $transformer = app(AttachmentTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new FractalCollection($attachments, $transformer, 'attachments');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
@@ -169,7 +172,6 @@ class ShowController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var AttachmentTransformer $transformer */
 | 
			
		||||
        $transformer = app(AttachmentTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new Item($attachment, $transformer, 'attachments');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,6 @@ class StoreController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var AttachmentTransformer $transformer */
 | 
			
		||||
        $transformer = app(AttachmentTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new Item($attachment, $transformer, 'attachments');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,6 @@ class UpdateController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var AttachmentTransformer $transformer */
 | 
			
		||||
        $transformer = app(AttachmentTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new Item($attachment, $transformer, 'attachments');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Controllers\Controller;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
 | 
			
		||||
use FireflyIII\Models\AvailableBudget;
 | 
			
		||||
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
 | 
			
		||||
use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment;
 | 
			
		||||
@@ -67,19 +68,21 @@ class ShowController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * Display a listing of the resource.
 | 
			
		||||
     */
 | 
			
		||||
    public function index(): JsonResponse
 | 
			
		||||
    public function index(PaginationDateRangeRequest $request): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        $manager          = $this->getManager();
 | 
			
		||||
 | 
			
		||||
        // types to get, page size:
 | 
			
		||||
        $pageSize         = $this->parameters->get('limit');
 | 
			
		||||
        $start            = $this->parameters->get('start');
 | 
			
		||||
        $end              = $this->parameters->get('end');
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'offset' => $offset,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
            'start'  => $start,
 | 
			
		||||
            'end'    => $end,
 | 
			
		||||
        ]                 = $request->attributes->all();
 | 
			
		||||
 | 
			
		||||
        // get list of available budgets. Count it and split it.
 | 
			
		||||
        $collection       = $this->abRepository->getAvailableBudgetsByDate($start, $end);
 | 
			
		||||
        $count            = $collection->count();
 | 
			
		||||
        $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
 | 
			
		||||
        $availableBudgets = $collection->slice($offset, $limit);
 | 
			
		||||
 | 
			
		||||
        // enrich
 | 
			
		||||
        /** @var User $admin */
 | 
			
		||||
@@ -89,12 +92,11 @@ class ShowController extends Controller
 | 
			
		||||
        $availableBudgets = $enrichment->enrich($availableBudgets);
 | 
			
		||||
 | 
			
		||||
        // make paginator:
 | 
			
		||||
        $paginator        = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page'));
 | 
			
		||||
        $paginator        = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
 | 
			
		||||
        $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
 | 
			
		||||
 | 
			
		||||
        /** @var AvailableBudgetTransformer $transformer */
 | 
			
		||||
        $transformer      = app(AvailableBudgetTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource         = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
@@ -116,15 +118,12 @@ class ShowController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var AvailableBudgetTransformer $transformer */
 | 
			
		||||
        $transformer     = app(AvailableBudgetTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        // enrich
 | 
			
		||||
        /** @var User $admin */
 | 
			
		||||
        $admin           = auth()->user();
 | 
			
		||||
        $enrichment      = new AvailableBudgetEnrichment();
 | 
			
		||||
        $enrichment->setUser($admin);
 | 
			
		||||
        //        $enrichment->setStart($start);
 | 
			
		||||
        //        $enrichment->setEnd($end);
 | 
			
		||||
        $availableBudget = $enrichment->enrichSingle($availableBudget);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,8 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Api\V1\Controllers\Models\Bill;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Controllers\Controller;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
 | 
			
		||||
use FireflyIII\Models\Bill;
 | 
			
		||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
 | 
			
		||||
@@ -35,7 +37,6 @@ use FireflyIII\Transformers\RuleTransformer;
 | 
			
		||||
use FireflyIII\Transformers\TransactionGroupTransformer;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Http\JsonResponse;
 | 
			
		||||
use Illuminate\Http\Request;
 | 
			
		||||
use Illuminate\Pagination\LengthAwarePaginator;
 | 
			
		||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 | 
			
		||||
use League\Fractal\Resource\Collection as FractalCollection;
 | 
			
		||||
@@ -71,22 +72,25 @@ class ListController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * Display a listing of the resource.
 | 
			
		||||
     */
 | 
			
		||||
    public function attachments(Bill $bill): JsonResponse
 | 
			
		||||
    public function attachments(PaginationRequest $request, Bill $bill): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'offset' => $offset,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
        ]            = $request->attributes->all();
 | 
			
		||||
        $manager     = $this->getManager();
 | 
			
		||||
        $pageSize    = $this->parameters->get('limit');
 | 
			
		||||
        $collection  = $this->repository->getAttachments($bill);
 | 
			
		||||
 | 
			
		||||
        $count       = $collection->count();
 | 
			
		||||
        $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
 | 
			
		||||
        $attachments = $collection->slice($offset, $limit);
 | 
			
		||||
 | 
			
		||||
        // make paginator:
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($attachments, $count, $limit, $page);
 | 
			
		||||
        $paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams());
 | 
			
		||||
 | 
			
		||||
        /** @var AttachmentTransformer $transformer */
 | 
			
		||||
        $transformer = app(AttachmentTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new FractalCollection($attachments, $transformer, 'attachments');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
@@ -100,25 +104,25 @@ class ListController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * List all of them.
 | 
			
		||||
     */
 | 
			
		||||
    public function rules(Bill $bill): JsonResponse
 | 
			
		||||
    public function rules(PaginationRequest $request, Bill $bill): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'offset' => $offset,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
        ]            = $request->attributes->all();
 | 
			
		||||
 | 
			
		||||
        $manager     = $this->getManager();
 | 
			
		||||
 | 
			
		||||
        // types to get, page size:
 | 
			
		||||
        $pageSize    = $this->parameters->get('limit');
 | 
			
		||||
 | 
			
		||||
        // get list of budgets. Count it and split it.
 | 
			
		||||
        $collection  = $this->repository->getRulesForBill($bill);
 | 
			
		||||
        $count       = $collection->count();
 | 
			
		||||
        $rules       = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
 | 
			
		||||
        $rules       = $collection->slice($offset, $limit);
 | 
			
		||||
 | 
			
		||||
        // make paginator:
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($rules, $count, $limit, $page);
 | 
			
		||||
        $paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams());
 | 
			
		||||
 | 
			
		||||
        /** @var RuleTransformer $transformer */
 | 
			
		||||
        $transformer = app(RuleTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
        $resource    = new FractalCollection($rules, $transformer, 'rules');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
 | 
			
		||||
@@ -131,13 +135,16 @@ class ListController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * Show all transactions.
 | 
			
		||||
     */
 | 
			
		||||
    public function transactions(Request $request, Bill $bill): JsonResponse
 | 
			
		||||
    public function transactions(PaginationDateRangeRequest $request, Bill $bill): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        $pageSize     = $this->parameters->get('limit');
 | 
			
		||||
        $type         = $request->get('type') ?? 'default';
 | 
			
		||||
        $this->parameters->set('type', $type);
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
            'types'  => $types,
 | 
			
		||||
            'start'  => $start,
 | 
			
		||||
            'end'    => $end,
 | 
			
		||||
        ]             = $request->attributes->all();
 | 
			
		||||
 | 
			
		||||
        $types        = $this->mapTransactionTypes($this->parameters->get('type'));
 | 
			
		||||
        $manager      = $this->getManager();
 | 
			
		||||
 | 
			
		||||
        /** @var User $admin */
 | 
			
		||||
@@ -153,18 +160,18 @@ class ListController extends Controller
 | 
			
		||||
            // all info needed for the API:
 | 
			
		||||
            ->withAPIInformation()
 | 
			
		||||
            // set page size:
 | 
			
		||||
            ->setLimit($pageSize)
 | 
			
		||||
            ->setLimit($limit)
 | 
			
		||||
            // set page to retrieve
 | 
			
		||||
            ->setPage($this->parameters->get('page'))
 | 
			
		||||
            ->setPage($page)
 | 
			
		||||
            // set types of transactions to return.
 | 
			
		||||
            ->setTypes($types)
 | 
			
		||||
        ;
 | 
			
		||||
 | 
			
		||||
        if (null !== $this->parameters->get('start')) {
 | 
			
		||||
            $collector->setStart($this->parameters->get('start'));
 | 
			
		||||
        if (null !== $start) {
 | 
			
		||||
            $collector->setStart($start);
 | 
			
		||||
        }
 | 
			
		||||
        if (null !== $this->parameters->get('end')) {
 | 
			
		||||
            $collector->setEnd($this->parameters->get('end'));
 | 
			
		||||
        if (null !== $end) {
 | 
			
		||||
            $collector->setEnd($end);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // get paginator.
 | 
			
		||||
@@ -178,7 +185,6 @@ class ListController extends Controller
 | 
			
		||||
 | 
			
		||||
        /** @var TransactionGroupTransformer $transformer */
 | 
			
		||||
        $transformer  = app(TransactionGroupTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource     = new FractalCollection($transactions, $transformer, 'transactions');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,8 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Api\V1\Controllers\Models\Bill;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Controllers\Controller;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\DateRangeRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
 | 
			
		||||
use FireflyIII\Models\Bill;
 | 
			
		||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
 | 
			
		||||
use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment;
 | 
			
		||||
@@ -65,28 +67,34 @@ class ShowController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * Display a listing of the resource.
 | 
			
		||||
     */
 | 
			
		||||
    public function index(): JsonResponse
 | 
			
		||||
    public function index(PaginationDateRangeRequest $request): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        [
 | 
			
		||||
            'limit'  => $limit,
 | 
			
		||||
            'offset' => $offset,
 | 
			
		||||
            'start'  => $start,
 | 
			
		||||
            'end'    => $end,
 | 
			
		||||
            'page'   => $page,
 | 
			
		||||
        ]            = $request->attributes->all();
 | 
			
		||||
 | 
			
		||||
        $this->repository->correctOrder();
 | 
			
		||||
        $bills       = $this->repository->getBills();
 | 
			
		||||
        $manager     = $this->getManager();
 | 
			
		||||
        $pageSize    = $this->parameters->get('limit');
 | 
			
		||||
        $count       = $bills->count();
 | 
			
		||||
        $bills       = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
 | 
			
		||||
        $bills       = $bills->slice($offset, $limit);
 | 
			
		||||
        $paginator   = new LengthAwarePaginator($bills, $count, $limit, $page);
 | 
			
		||||
 | 
			
		||||
        // enrich
 | 
			
		||||
        /** @var User $admin */
 | 
			
		||||
        $admin       = auth()->user();
 | 
			
		||||
        $enrichment  = new SubscriptionEnrichment();
 | 
			
		||||
        $enrichment->setUser($admin);
 | 
			
		||||
        $enrichment->setStart($this->parameters->get('start'));
 | 
			
		||||
        $enrichment->setEnd($this->parameters->get('end'));
 | 
			
		||||
        $enrichment->setStart($start);
 | 
			
		||||
        $enrichment->setEnd($end);
 | 
			
		||||
        $bills       = $enrichment->enrich($bills);
 | 
			
		||||
 | 
			
		||||
        /** @var BillTransformer $transformer */
 | 
			
		||||
        $transformer = app(BillTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new FractalCollection($bills, $transformer, 'bills');
 | 
			
		||||
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
 | 
			
		||||
@@ -100,8 +108,13 @@ class ShowController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * Show the specified bill.
 | 
			
		||||
     */
 | 
			
		||||
    public function show(Bill $bill): JsonResponse
 | 
			
		||||
    public function show(DateRangeRequest $request, Bill $bill): JsonResponse
 | 
			
		||||
    {
 | 
			
		||||
        [
 | 
			
		||||
            'start'  => $start,
 | 
			
		||||
            'end'    => $end,
 | 
			
		||||
        ]            = $request->attributes->all();
 | 
			
		||||
 | 
			
		||||
        $manager     = $this->getManager();
 | 
			
		||||
 | 
			
		||||
        // enrich
 | 
			
		||||
@@ -109,13 +122,12 @@ class ShowController extends Controller
 | 
			
		||||
        $admin       = auth()->user();
 | 
			
		||||
        $enrichment  = new SubscriptionEnrichment();
 | 
			
		||||
        $enrichment->setUser($admin);
 | 
			
		||||
        $enrichment->setStart($this->parameters->get('start'));
 | 
			
		||||
        $enrichment->setEnd($this->parameters->get('end'));
 | 
			
		||||
        $enrichment->setStart($start);
 | 
			
		||||
        $enrichment->setEnd($end);
 | 
			
		||||
        $bill        = $enrichment->enrichSingle($bill);
 | 
			
		||||
 | 
			
		||||
        /** @var BillTransformer $transformer */
 | 
			
		||||
        $transformer = app(BillTransformer::class);
 | 
			
		||||
        $transformer->setParameters($this->parameters);
 | 
			
		||||
 | 
			
		||||
        $resource    = new Item($bill, $transformer, 'bills');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,7 @@ abstract class AggregateFormRequest extends ApiRequest
 | 
			
		||||
 | 
			
		||||
        // instantiate all subrequests and share current requests' bags with them
 | 
			
		||||
        Log::debug('Initializing AggregateFormRequest.');
 | 
			
		||||
 | 
			
		||||
        foreach ($this->getRequests() as $config) {
 | 
			
		||||
            $requestClass         = is_array($config) ? array_shift($config) : $config;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,8 @@ namespace FireflyIII\Api\V1\Requests\Autocomplete;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\DateRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\ObjectTypeApiRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\QueryRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Models\Account\AccountTypesApiRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Models\Account;
 | 
			
		||||
use Override;
 | 
			
		||||
@@ -39,7 +39,7 @@ class AutocompleteApiRequest extends AggregateFormRequest
 | 
			
		||||
        return [
 | 
			
		||||
            DateRequest::class,
 | 
			
		||||
            [PaginationRequest::class, 'sort_class' => Account::class],
 | 
			
		||||
            AccountTypesApiRequest::class,
 | 
			
		||||
            [ObjectTypeApiRequest::class, 'object_type' => Account::class],
 | 
			
		||||
            QueryRequest::class,
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,47 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
/*
 | 
			
		||||
 * AutocompleteApiRequest.php
 | 
			
		||||
 * Copyright (c) 2025 james@firefly-iii.org
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of Firefly III (https://github.com/firefly-iii).
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace FireflyIII\Api\V1\Requests\Autocomplete;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\DateRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\ObjectTypeApiRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\QueryRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Models\Account;
 | 
			
		||||
use FireflyIII\Models\Transaction;
 | 
			
		||||
use Override;
 | 
			
		||||
 | 
			
		||||
class AutocompleteTransactionApiRequest extends AggregateFormRequest
 | 
			
		||||
{
 | 
			
		||||
    #[Override]
 | 
			
		||||
    protected function getRequests(): array
 | 
			
		||||
    {
 | 
			
		||||
        return [
 | 
			
		||||
            DateRequest::class,
 | 
			
		||||
            [PaginationRequest::class, 'sort_class' => Account::class],
 | 
			
		||||
            [ObjectTypeApiRequest::class, 'object_type' => Transaction::class],
 | 
			
		||||
            QueryRequest::class,
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										101
									
								
								app/Api/V1/Requests/Generic/ObjectTypeApiRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								app/Api/V1/Requests/Generic/ObjectTypeApiRequest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
/*
 | 
			
		||||
 * AccountTypeApiRequest.php
 | 
			
		||||
 * Copyright (c) 2025 https://github.com/ctrl-f5
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of Firefly III (https://github.com/firefly-iii).
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace FireflyIII\Api\V1\Requests\Generic;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Requests\ApiRequest;
 | 
			
		||||
use FireflyIII\Models\Account;
 | 
			
		||||
use FireflyIII\Models\Transaction;
 | 
			
		||||
use FireflyIII\Rules\Account\IsValidAccountTypeList;
 | 
			
		||||
use FireflyIII\Rules\TransactionType\IsValidTransactionTypeList;
 | 
			
		||||
use FireflyIII\Support\Http\Api\AccountFilter;
 | 
			
		||||
use FireflyIII\Support\Http\Api\TransactionFilter;
 | 
			
		||||
use Illuminate\Validation\Validator;
 | 
			
		||||
use RuntimeException;
 | 
			
		||||
 | 
			
		||||
class ObjectTypeApiRequest extends ApiRequest
 | 
			
		||||
{
 | 
			
		||||
    use AccountFilter;
 | 
			
		||||
    use TransactionFilter;
 | 
			
		||||
 | 
			
		||||
    private ?string $objectType = null;
 | 
			
		||||
 | 
			
		||||
    public function handleConfig(array $config): void
 | 
			
		||||
    {
 | 
			
		||||
        parent::handleConfig($config);
 | 
			
		||||
 | 
			
		||||
        $this->objectType = $config['object_type'] ?? null;
 | 
			
		||||
 | 
			
		||||
        if (!$this->objectType) {
 | 
			
		||||
            throw new RuntimeException('ObjectTypeApiRequest requires a object_type config');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function rules(): array
 | 
			
		||||
    {
 | 
			
		||||
        $rule  = null;
 | 
			
		||||
        if (Account::class === $this->objectType) {
 | 
			
		||||
            $rule = new IsValidAccountTypeList();
 | 
			
		||||
        }
 | 
			
		||||
        if (Transaction::class === $this->objectType) {
 | 
			
		||||
            $rule = new IsValidTransactionTypeList();
 | 
			
		||||
        }
 | 
			
		||||
        $rules = [
 | 
			
		||||
            'types' => [$rule],
 | 
			
		||||
        ];
 | 
			
		||||
        if ('' !== $this->required) {
 | 
			
		||||
            $rules['types'][] = $this->required;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $rules;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function withValidator(Validator $validator): void
 | 
			
		||||
    {
 | 
			
		||||
        $validator->after(
 | 
			
		||||
            function (Validator $validator): void {
 | 
			
		||||
                if ($validator->failed()) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                $type = $this->convertString('types', 'all');
 | 
			
		||||
                $this->attributes->set('type', $type);
 | 
			
		||||
 | 
			
		||||
                switch ($this->objectType) {
 | 
			
		||||
                    default:
 | 
			
		||||
                        $this->attributes->set('types', []);
 | 
			
		||||
 | 
			
		||||
                        // no break
 | 
			
		||||
                    case Account::class:
 | 
			
		||||
                        $this->attributes->set('types', $this->mapAccountTypes($type));
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case Transaction::class:
 | 
			
		||||
                        $this->attributes->set('types', $this->mapTransactionTypes($type));
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								app/Api/V1/Requests/Generic/PaginationDateRangeRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								app/Api/V1/Requests/Generic/PaginationDateRangeRequest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
/*
 | 
			
		||||
 * PaginationDateRangeRequest.php
 | 
			
		||||
 * Copyright (c) 2025 james@firefly-iii.org
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of Firefly III (https://github.com/firefly-iii).
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace FireflyIII\Api\V1\Requests\Generic;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\DateRangeRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Models\Transaction;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * TODO this class includes an object type filter which should be moved to its own thing.
 | 
			
		||||
 */
 | 
			
		||||
class PaginationDateRangeRequest extends AggregateFormRequest
 | 
			
		||||
{
 | 
			
		||||
    #[Override]
 | 
			
		||||
    protected function getRequests(): array
 | 
			
		||||
    {
 | 
			
		||||
        return [
 | 
			
		||||
            DateRangeRequest::class,
 | 
			
		||||
            [ObjectTypeApiRequest::class, 'object_type' => Transaction::class],
 | 
			
		||||
            [PaginationRequest::class, 'sort_class' => Transaction::class],
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests\Models\Account;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\DateRangeRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\DateRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\Generic\ObjectTypeApiRequest;
 | 
			
		||||
use FireflyIII\Api\V1\Requests\PaginationRequest;
 | 
			
		||||
use FireflyIII\Models\Account;
 | 
			
		||||
 | 
			
		||||
@@ -38,6 +39,7 @@ class ShowRequest extends AggregateFormRequest
 | 
			
		||||
            DateRangeRequest::class,
 | 
			
		||||
            DateRequest::class,
 | 
			
		||||
            AccountTypeApiRequest::class,
 | 
			
		||||
            [ObjectTypeApiRequest::class, 'object_type' => Account::class],
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ use FireflyIII\Repositories\ObjectGroup\CreatesObjectGroups;
 | 
			
		||||
use FireflyIII\Services\Internal\Support\BillServiceTrait;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Database\QueryException;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class BillFactory
 | 
			
		||||
@@ -47,7 +48,7 @@ class BillFactory
 | 
			
		||||
     */
 | 
			
		||||
    public function create(array $data): ?Bill
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__), $data);
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__), $data);
 | 
			
		||||
        $factory          = app(TransactionCurrencyFactory::class);
 | 
			
		||||
        $currency         = $factory->find((int) ($data['currency_id'] ?? null), (string) ($data['currency_code'] ?? null))
 | 
			
		||||
                    ?? app('amount')->getPrimaryCurrencyByUserGroup($this->user->userGroup);
 | 
			
		||||
@@ -82,8 +83,8 @@ class BillFactory
 | 
			
		||||
                ]
 | 
			
		||||
            );
 | 
			
		||||
        } catch (QueryException $e) {
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException('400000: Could not store bill.', 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Models\Category;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Database\QueryException;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class CategoryFactory
 | 
			
		||||
@@ -43,7 +44,7 @@ class CategoryFactory
 | 
			
		||||
        $categoryId   = (int) $categoryId;
 | 
			
		||||
        $categoryName = (string) $categoryName;
 | 
			
		||||
 | 
			
		||||
        app('log')->debug(sprintf('Going to find category with ID %d and name "%s"', $categoryId, $categoryName));
 | 
			
		||||
        Log::debug(sprintf('Going to find category with ID %d and name "%s"', $categoryId, $categoryName));
 | 
			
		||||
 | 
			
		||||
        if ('' === $categoryName && 0 === $categoryId) {
 | 
			
		||||
            return null;
 | 
			
		||||
@@ -72,8 +73,8 @@ class CategoryFactory
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
            } catch (QueryException $e) {
 | 
			
		||||
                app('log')->error($e->getMessage());
 | 
			
		||||
                app('log')->error($e->getTraceAsString());
 | 
			
		||||
                Log::error($e->getMessage());
 | 
			
		||||
                Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
                throw new FireflyException('400003: Could not store new category.', 0, $e);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,7 @@ class PiggyBankFactory
 | 
			
		||||
            /** @var PiggyBank $piggyBank */
 | 
			
		||||
            $piggyBank = PiggyBank::createQuietly($piggyBankData);
 | 
			
		||||
        } catch (QueryException $e) {
 | 
			
		||||
            app('log')->error(sprintf('Could not store piggy bank: %s', $e->getMessage()), $piggyBankData);
 | 
			
		||||
            Log::error(sprintf('Could not store piggy bank: %s', $e->getMessage()), $piggyBankData);
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException('400005: Could not store new piggy bank.', 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
@@ -211,7 +211,7 @@ class PiggyBankFactory
 | 
			
		||||
        $current = 1;
 | 
			
		||||
        foreach ($set as $piggyBank) {
 | 
			
		||||
            if ($piggyBank->order !== $current) {
 | 
			
		||||
                app('log')->debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current));
 | 
			
		||||
                Log::debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current));
 | 
			
		||||
                $piggyBank->order = $current;
 | 
			
		||||
                $piggyBank->save();
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ use FireflyIII\Models\Location;
 | 
			
		||||
use FireflyIII\Models\Tag;
 | 
			
		||||
use FireflyIII\Models\UserGroup;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class TagFactory
 | 
			
		||||
@@ -40,12 +41,12 @@ class TagFactory
 | 
			
		||||
    public function findOrCreate(string $tag): ?Tag
 | 
			
		||||
    {
 | 
			
		||||
        $tag    = trim($tag);
 | 
			
		||||
        app('log')->debug(sprintf('Now in TagFactory::findOrCreate("%s")', $tag));
 | 
			
		||||
        Log::debug(sprintf('Now in TagFactory::findOrCreate("%s")', $tag));
 | 
			
		||||
 | 
			
		||||
        /** @var null|Tag $dbTag */
 | 
			
		||||
        $dbTag  = $this->user->tags()->where('tag', $tag)->first();
 | 
			
		||||
        if (null !== $dbTag) {
 | 
			
		||||
            app('log')->debug(sprintf('Tag exists (#%d), return it.', $dbTag->id));
 | 
			
		||||
            Log::debug(sprintf('Tag exists (#%d), return it.', $dbTag->id));
 | 
			
		||||
 | 
			
		||||
            return $dbTag;
 | 
			
		||||
        }
 | 
			
		||||
@@ -60,11 +61,11 @@ class TagFactory
 | 
			
		||||
            ]
 | 
			
		||||
        );
 | 
			
		||||
        if (!$newTag instanceof Tag) {
 | 
			
		||||
            app('log')->error(sprintf('TagFactory::findOrCreate("%s") but tag is unexpectedly NULL!', $tag));
 | 
			
		||||
            Log::error(sprintf('TagFactory::findOrCreate("%s") but tag is unexpectedly NULL!', $tag));
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug(sprintf('Created new tag #%d ("%s")', $newTag->id, $newTag->tag));
 | 
			
		||||
        Log::debug(sprintf('Created new tag #%d ("%s")', $newTag->id, $newTag->tag));
 | 
			
		||||
 | 
			
		||||
        return $newTag;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ use FireflyIII\Rules\UniqueIban;
 | 
			
		||||
use FireflyIII\Services\Internal\Update\AccountUpdateService;
 | 
			
		||||
use Illuminate\Database\QueryException;
 | 
			
		||||
use Illuminate\Support\Facades\Validator;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class TransactionFactory
 | 
			
		||||
@@ -96,9 +97,9 @@ class TransactionFactory
 | 
			
		||||
            /** @var null|Transaction $result */
 | 
			
		||||
            $result = Transaction::create($data);
 | 
			
		||||
        } catch (QueryException $e) {
 | 
			
		||||
            app('log')->error(sprintf('Could not create transaction: %s', $e->getMessage()), $data);
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Could not create transaction: %s', $e->getMessage()), $data);
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException(sprintf('Query exception when creating transaction: %s', $e->getMessage()), 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
@@ -106,7 +107,7 @@ class TransactionFactory
 | 
			
		||||
            throw new FireflyException('Transaction is NULL.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        app('log')->debug(
 | 
			
		||||
        Log::debug(
 | 
			
		||||
            sprintf(
 | 
			
		||||
                'Created transaction #%d (%s %s, account %s), part of journal #%d',
 | 
			
		||||
                $result->id,
 | 
			
		||||
@@ -138,17 +139,17 @@ class TransactionFactory
 | 
			
		||||
    private function updateAccountInformation(): void
 | 
			
		||||
    {
 | 
			
		||||
        if (!array_key_exists('iban', $this->accountInformation)) {
 | 
			
		||||
            app('log')->debug('No IBAN information in array, will not update.');
 | 
			
		||||
            Log::debug('No IBAN information in array, will not update.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if ('' !== (string) $this->account->iban) {
 | 
			
		||||
            app('log')->debug('Account already has IBAN information, will not update.');
 | 
			
		||||
            Log::debug('Account already has IBAN information, will not update.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if ($this->account->iban === $this->accountInformation['iban']) {
 | 
			
		||||
            app('log')->debug('Account already has this IBAN, will not update.');
 | 
			
		||||
            Log::debug('Account already has this IBAN, will not update.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -157,12 +158,12 @@ class TransactionFactory
 | 
			
		||||
            'iban' => ['required', new UniqueIban($this->account, $this->account->accountType->type)],
 | 
			
		||||
        ]);
 | 
			
		||||
        if ($validator->fails()) {
 | 
			
		||||
            app('log')->debug('Invalid or non-unique IBAN, will not update.');
 | 
			
		||||
            Log::debug('Invalid or non-unique IBAN, will not update.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        app('log')->debug('Will update account with IBAN information.');
 | 
			
		||||
        Log::debug('Will update account with IBAN information.');
 | 
			
		||||
        $service   = app(AccountUpdateService::class);
 | 
			
		||||
        $service->update($this->account, ['iban' => $this->accountInformation['iban']]);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Models\TransactionGroup;
 | 
			
		||||
use FireflyIII\Models\UserGroup;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class TransactionGroupFactory
 | 
			
		||||
@@ -55,7 +56,7 @@ class TransactionGroupFactory
 | 
			
		||||
     */
 | 
			
		||||
    public function create(array $data): TransactionGroup
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Now in TransactionGroupFactory::create()');
 | 
			
		||||
        Log::debug('Now in TransactionGroupFactory::create()');
 | 
			
		||||
        $this->journalFactory->setUser($data['user']);
 | 
			
		||||
        $this->journalFactory->setUserGroup($data['user_group']);
 | 
			
		||||
        $this->journalFactory->setErrorOnHash($data['error_if_duplicate_hash'] ?? false);
 | 
			
		||||
@@ -63,7 +64,7 @@ class TransactionGroupFactory
 | 
			
		||||
        try {
 | 
			
		||||
            $collection = $this->journalFactory->create($data);
 | 
			
		||||
        } catch (DuplicateTransactionException $e) {
 | 
			
		||||
            app('log')->warning('GroupFactory::create() caught journalFactory::create() with a duplicate!');
 | 
			
		||||
            Log::warning('GroupFactory::create() caught journalFactory::create() with a duplicate!');
 | 
			
		||||
 | 
			
		||||
            throw new DuplicateTransactionException($e->getMessage(), 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Factory;
 | 
			
		||||
 | 
			
		||||
use Carbon\Carbon;
 | 
			
		||||
use FireflyIII\Models\TransactionJournalMeta;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class TransactionJournalMetaFactory
 | 
			
		||||
@@ -34,27 +35,27 @@ class TransactionJournalMetaFactory
 | 
			
		||||
{
 | 
			
		||||
    public function updateOrCreate(array $data): ?TransactionJournalMeta
 | 
			
		||||
    {
 | 
			
		||||
        // app('log')->debug('In updateOrCreate()');
 | 
			
		||||
        // Log::debug('In updateOrCreate()');
 | 
			
		||||
        $value       = $data['data'];
 | 
			
		||||
 | 
			
		||||
        /** @var null|TransactionJournalMeta $entry */
 | 
			
		||||
        $entry       = $data['journal']->transactionJournalMeta()->where('name', $data['name'])->first();
 | 
			
		||||
        if (null === $value && null !== $entry) {
 | 
			
		||||
            // app('log')->debug('Value is empty, delete meta value.');
 | 
			
		||||
            // Log::debug('Value is empty, delete meta value.');
 | 
			
		||||
            $entry->delete();
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($data['data'] instanceof Carbon) {
 | 
			
		||||
            app('log')->debug('Is a carbon object.');
 | 
			
		||||
            Log::debug('Is a carbon object.');
 | 
			
		||||
            $value = $data['data']->toW3cString();
 | 
			
		||||
        }
 | 
			
		||||
        if ('' === (string) $value) {
 | 
			
		||||
            // app('log')->debug('Is an empty string.');
 | 
			
		||||
            // Log::debug('Is an empty string.');
 | 
			
		||||
            // don't store blank strings.
 | 
			
		||||
            if (null !== $entry) {
 | 
			
		||||
                app('log')->debug('Will not store empty strings, delete meta value');
 | 
			
		||||
                Log::debug('Will not store empty strings, delete meta value');
 | 
			
		||||
                $entry->delete();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -62,13 +63,13 @@ class TransactionJournalMetaFactory
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (null === $entry) {
 | 
			
		||||
            // app('log')->debug('Will create new object.');
 | 
			
		||||
            app('log')->debug(sprintf('Going to create new meta-data entry to store "%s".', $data['name']));
 | 
			
		||||
            // Log::debug('Will create new object.');
 | 
			
		||||
            Log::debug(sprintf('Going to create new meta-data entry to store "%s".', $data['name']));
 | 
			
		||||
            $entry       = new TransactionJournalMeta();
 | 
			
		||||
            $entry->transactionJournal()->associate($data['journal']);
 | 
			
		||||
            $entry->name = $data['name'];
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug('Will update value and return.');
 | 
			
		||||
        Log::debug('Will update value and return.');
 | 
			
		||||
        $entry->data = $value;
 | 
			
		||||
        $entry->save();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -58,8 +59,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                ->render()
 | 
			
		||||
            ;
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.double.report: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.double.report: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = sprintf('Could not render report view: %s', $e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
 
 | 
			
		||||
@@ -105,8 +105,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                ->render()
 | 
			
		||||
            ;
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.audit.report: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.audit.report: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = sprintf('Could not render report view: %s', $e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@ use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -72,8 +73,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                ->render()
 | 
			
		||||
            ;
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.account.report: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.account.report: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = sprintf('Could not render report view: %s', $e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
@@ -132,7 +133,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
    protected function getExpenses(): array
 | 
			
		||||
    {
 | 
			
		||||
        if (0 !== count($this->expenses)) {
 | 
			
		||||
            app('log')->debug('Return previous set of expenses.');
 | 
			
		||||
            Log::debug('Return previous set of expenses.');
 | 
			
		||||
 | 
			
		||||
            return $this->expenses;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@ use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -73,8 +74,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                ->render()
 | 
			
		||||
            ;
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.category.month: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.category.month: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = sprintf('Could not render report view: %s', $e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
@@ -131,7 +132,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
    protected function getExpenses(): array
 | 
			
		||||
    {
 | 
			
		||||
        if (0 !== count($this->expenses)) {
 | 
			
		||||
            app('log')->debug('Return previous set of expenses.');
 | 
			
		||||
            Log::debug('Return previous set of expenses.');
 | 
			
		||||
 | 
			
		||||
            return $this->expenses;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -56,8 +57,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
        try {
 | 
			
		||||
            return view('reports.default.month', compact('accountIds', 'reportType'))->with('start', $this->start)->with('end', $this->end)->render();
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.default.month: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.default.month: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = 'Could not render report view.';
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -60,8 +61,8 @@ class MultiYearReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                compact('accountIds', 'reportType')
 | 
			
		||||
            )->with('start', $this->start)->with('end', $this->end)->render();
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.default.multi-year: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.default.multi-year: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = sprintf('Could not render report view: %s', $e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -60,8 +61,8 @@ class YearReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                compact('accountIds', 'reportType')
 | 
			
		||||
            )->with('start', $this->start)->with('end', $this->end)->render();
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.account.report: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.account.report: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = 'Could not render report view.';
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Generator\Report\ReportGeneratorInterface;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Throwable;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class MonthReportGenerator.
 | 
			
		||||
@@ -67,8 +68,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
 | 
			
		||||
                compact('accountIds', 'reportType', 'tagIds')
 | 
			
		||||
            )->with('start', $this->start)->with('end', $this->end)->with('tags', $this->tags)->with('accounts', $this->accounts)->render();
 | 
			
		||||
        } catch (Throwable $e) {
 | 
			
		||||
            app('log')->error(sprintf('Cannot render reports.tag.month: %s', $e->getMessage()));
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error(sprintf('Cannot render reports.tag.month: %s', $e->getMessage()));
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
            $result = sprintf('Could not render report view: %s', $e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($result, 0, $e);
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ use FireflyIII\Notifications\User\NewAccessToken;
 | 
			
		||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Notification;
 | 
			
		||||
use Laravel\Passport\Events\AccessTokenCreated;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class APIEventHandler
 | 
			
		||||
@@ -40,7 +41,7 @@ class APIEventHandler
 | 
			
		||||
     */
 | 
			
		||||
    public function accessTokenCreated(AccessTokenCreated $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(__METHOD__);
 | 
			
		||||
        Log::debug(__METHOD__);
 | 
			
		||||
 | 
			
		||||
        /** @var UserRepositoryInterface $repository */
 | 
			
		||||
        $repository = app(UserRepositoryInterface::class);
 | 
			
		||||
@@ -52,17 +53,17 @@ class APIEventHandler
 | 
			
		||||
            } catch (Exception $e) {
 | 
			
		||||
                $message = $e->getMessage();
 | 
			
		||||
                if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                    app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                    Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                    app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                    Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                app('log')->error($e->getMessage());
 | 
			
		||||
                app('log')->error($e->getTraceAsString());
 | 
			
		||||
                Log::error($e->getMessage());
 | 
			
		||||
                Log::error($e->getTraceAsString());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -55,17 +55,17 @@ class AdminEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -77,17 +77,17 @@ class AdminEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -107,17 +107,17 @@ class AdminEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -150,7 +150,7 @@ class AdminEventHandler
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                app('log')->error(sprintf('Unknown channel "%s" in sendTestNotification method.', $event->channel));
 | 
			
		||||
                Log::error(sprintf('Unknown channel "%s" in sendTestNotification method.', $event->channel));
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -161,17 +161,17 @@ class AdminEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
        Log::debug(sprintf('If you see no errors above this line, test notification was sent over channel "%s"', $event->channel));
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ namespace FireflyIII\Handlers\Events;
 | 
			
		||||
use Carbon\Carbon;
 | 
			
		||||
use FireflyIII\Events\TriggeredAuditLog;
 | 
			
		||||
use FireflyIII\Repositories\AuditLogEntry\ALERepositoryInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class AuditEventHandler
 | 
			
		||||
@@ -44,20 +45,20 @@ class AuditEventHandler
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        if ($event->before === $event->after) {
 | 
			
		||||
            app('log')->debug('Will not store event log because before and after are the same.');
 | 
			
		||||
            Log::debug('Will not store event log because before and after are the same.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if ($event->before instanceof Carbon && $event->after instanceof Carbon && $event->before->eq($event->after)) {
 | 
			
		||||
            app('log')->debug('Will not store event log because before and after Carbon values are the same.');
 | 
			
		||||
            Log::debug('Will not store event log because before and after Carbon values are the same.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if ($event->before instanceof Carbon && $event->after instanceof Carbon) {
 | 
			
		||||
            $array['before'] = $event->before->toIso8601String();
 | 
			
		||||
            $array['after']  = $event->after->toIso8601String();
 | 
			
		||||
            app('log')->debug(sprintf('Converted "before" to "%s".', $event->before));
 | 
			
		||||
            app('log')->debug(sprintf('Converted "after" to "%s".', $event->after));
 | 
			
		||||
            Log::debug(sprintf('Converted "before" to "%s".', $event->before));
 | 
			
		||||
            Log::debug(sprintf('Converted "after" to "%s".', $event->after));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /** @var ALERepositoryInterface $repository */
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ use FireflyIII\Repositories\User\UserRepositoryInterface;
 | 
			
		||||
use FireflyIII\Support\Facades\Preferences;
 | 
			
		||||
use FireflyIII\Transformers\TransactionGroupTransformer;
 | 
			
		||||
use Illuminate\Support\Facades\Notification;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class AutomationHandler
 | 
			
		||||
@@ -46,7 +47,7 @@ class AutomationHandler
 | 
			
		||||
     */
 | 
			
		||||
    public function reportJournals(RequestedReportOnJournals $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('In reportJournals.');
 | 
			
		||||
        Log::debug('In reportJournals.');
 | 
			
		||||
 | 
			
		||||
        /** @var UserRepositoryInterface $repository */
 | 
			
		||||
        $repository  = app(UserRepositoryInterface::class);
 | 
			
		||||
@@ -56,17 +57,17 @@ class AutomationHandler
 | 
			
		||||
        $sendReport  = Preferences::getForUser($user, 'notification_transaction_creation', false)->data;
 | 
			
		||||
 | 
			
		||||
        if (false === $sendReport) {
 | 
			
		||||
            app('log')->debug('Not sending report, because config says so.');
 | 
			
		||||
            Log::debug('Not sending report, because config says so.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (null === $user || 0 === $event->groups->count()) {
 | 
			
		||||
            app('log')->debug('No transaction groups in event, nothing to email about.');
 | 
			
		||||
            Log::debug('No transaction groups in event, nothing to email about.');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug('Continue with message!');
 | 
			
		||||
        Log::debug('Continue with message!');
 | 
			
		||||
 | 
			
		||||
        // transform groups into array:
 | 
			
		||||
        /** @var TransactionGroupTransformer $transformer */
 | 
			
		||||
@@ -83,18 +84,18 @@ class AutomationHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug('If there is no error above this line, message was sent.');
 | 
			
		||||
        Log::debug('If there is no error above this line, message was sent.');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ class DestroyedGroupEventHandler
 | 
			
		||||
 | 
			
		||||
    private function triggerWebhooks(DestroyedTransactionGroup $destroyedGroupEvent): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('DestroyedTransactionGroup:triggerWebhooks');
 | 
			
		||||
        Log::debug('DestroyedTransactionGroup:triggerWebhooks');
 | 
			
		||||
        $group  = $destroyedGroupEvent->transactionGroup;
 | 
			
		||||
        $user   = $group->user;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ use FireflyIII\Models\PiggyBankEvent;
 | 
			
		||||
use FireflyIII\Models\Rule;
 | 
			
		||||
use FireflyIII\Models\RuleAction;
 | 
			
		||||
use FireflyIII\Models\TransactionGroup;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class PiggyBankEventHandler
 | 
			
		||||
@@ -70,7 +71,7 @@ class PiggyBankEventHandler
 | 
			
		||||
                ->exists()
 | 
			
		||||
            ;
 | 
			
		||||
            if ($exists) {
 | 
			
		||||
                app('log')->warning('Already have event for this journal and piggy, will not create another.');
 | 
			
		||||
                Log::warning('Already have event for this journal and piggy, will not create another.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ class RuleHandler
 | 
			
		||||
        if (false === $preference) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug('Now in ruleActionFailedOnArray');
 | 
			
		||||
        Log::debug('Now in ruleActionFailedOnArray');
 | 
			
		||||
        $journal     = $event->journal;
 | 
			
		||||
        $error       = $event->error;
 | 
			
		||||
        $user        = $ruleAction->rule->user;
 | 
			
		||||
@@ -76,7 +76,7 @@ class RuleHandler
 | 
			
		||||
        if (false === $preference) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug('Now in ruleActionFailedOnObject');
 | 
			
		||||
        Log::debug('Now in ruleActionFailedOnObject');
 | 
			
		||||
        $journal     = $event->journal;
 | 
			
		||||
        $error       = $event->error;
 | 
			
		||||
        $user        = $ruleAction->rule->user;
 | 
			
		||||
 
 | 
			
		||||
@@ -40,12 +40,13 @@ use FireflyIII\Notifications\Security\MFAManyFailedAttemptsNotification;
 | 
			
		||||
use FireflyIII\Notifications\Security\MFAUsedBackupCodeNotification;
 | 
			
		||||
use FireflyIII\Notifications\Security\NewBackupCodesNotification;
 | 
			
		||||
use Illuminate\Support\Facades\Notification;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
class MFAHandler
 | 
			
		||||
{
 | 
			
		||||
    public function sendBackupFewLeftMail(MFABackupFewLeft $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user  = $event->user;
 | 
			
		||||
        $count = $event->count;
 | 
			
		||||
@@ -55,23 +56,23 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function sendBackupNoLeftMail(MFABackupNoLeft $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user = $event->user;
 | 
			
		||||
 | 
			
		||||
@@ -80,23 +81,23 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function sendMFADisabledMail(DisabledMFA $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user = $event->user;
 | 
			
		||||
 | 
			
		||||
@@ -105,23 +106,23 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function sendMFAEnabledMail(EnabledMFA $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user = $event->user;
 | 
			
		||||
 | 
			
		||||
@@ -130,23 +131,23 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function sendMFAFailedAttemptsMail(MFAManyFailedAttempts $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user  = $event->user;
 | 
			
		||||
        $count = $event->count;
 | 
			
		||||
@@ -156,23 +157,23 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function sendNewMFABackupCodesMail(MFANewBackupCodes $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user = $event->user;
 | 
			
		||||
 | 
			
		||||
@@ -181,23 +182,23 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function sendUsedBackupCodeMail(MFAUsedBackupCode $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
        Log::debug(sprintf('Now in %s', __METHOD__));
 | 
			
		||||
 | 
			
		||||
        $user = $event->user;
 | 
			
		||||
 | 
			
		||||
@@ -206,17 +207,17 @@ class MFAHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ class UserEventHandler
 | 
			
		||||
 | 
			
		||||
        // first user ever?
 | 
			
		||||
        if (1 === $repository->count()) {
 | 
			
		||||
            app('log')->debug('User count is one, attach role.');
 | 
			
		||||
            Log::debug('User count is one, attach role.');
 | 
			
		||||
            $repository->attachRole($event->user, 'owner');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -101,10 +101,10 @@ class UserEventHandler
 | 
			
		||||
            if (null === $role) {
 | 
			
		||||
                // create role, does not exist. Very strange situation so let's raise a big fuss about it.
 | 
			
		||||
                $role = $repository->createRole('owner', 'Site Owner', 'User runs this instance of FF3');
 | 
			
		||||
                app('log')->error('Could not find role "owner". This is weird.');
 | 
			
		||||
                Log::error('Could not find role "owner". This is weird.');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            app('log')->info(sprintf('Gave user #%d role #%d ("%s")', $user->id, $role->id, $role->name));
 | 
			
		||||
            Log::info(sprintf('Gave user #%d role #%d ("%s")', $user->id, $role->id, $role->name));
 | 
			
		||||
            // give user the role
 | 
			
		||||
            $repository->attachRole($user, 'owner');
 | 
			
		||||
        }
 | 
			
		||||
@@ -203,17 +203,17 @@ class UserEventHandler
 | 
			
		||||
                } catch (Exception $e) {
 | 
			
		||||
                    $message = $e->getMessage();
 | 
			
		||||
                    if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                        app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                        Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                        app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                        Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    app('log')->error($e->getMessage());
 | 
			
		||||
                    app('log')->error($e->getTraceAsString());
 | 
			
		||||
                    Log::error($e->getMessage());
 | 
			
		||||
                    Log::error($e->getTraceAsString());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            $list[$index]['notified'] = true;
 | 
			
		||||
@@ -233,17 +233,17 @@ class UserEventHandler
 | 
			
		||||
            } catch (Exception $e) {
 | 
			
		||||
                $message = $e->getMessage();
 | 
			
		||||
                if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                    app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                    Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                    app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                    Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                app('log')->error($e->getMessage());
 | 
			
		||||
                app('log')->error($e->getTraceAsString());
 | 
			
		||||
                Log::error($e->getMessage());
 | 
			
		||||
                Log::error($e->getTraceAsString());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -265,8 +265,8 @@ class UserEventHandler
 | 
			
		||||
        try {
 | 
			
		||||
            Mail::to($newEmail)->send(new ConfirmEmailChangeMail($newEmail, $oldEmail, $url));
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($e->getMessage(), 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
@@ -290,8 +290,8 @@ class UserEventHandler
 | 
			
		||||
        try {
 | 
			
		||||
            Mail::to($oldEmail)->send(new UndoEmailChangeMail($newEmail, $oldEmail, $url));
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($e->getMessage(), 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
@@ -304,17 +304,17 @@ class UserEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -328,17 +328,17 @@ class UserEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -354,8 +354,8 @@ class UserEventHandler
 | 
			
		||||
        try {
 | 
			
		||||
            Mail::to($invitee)->send(new InvitationMail($invitee, $admin, $url));
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($e->getMessage(), 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
@@ -374,17 +374,17 @@ class UserEventHandler
 | 
			
		||||
            } catch (Exception $e) {
 | 
			
		||||
                $message = $e->getMessage();
 | 
			
		||||
                if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                    app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                    Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                    app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                    Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                app('log')->error($e->getMessage());
 | 
			
		||||
                app('log')->error($e->getTraceAsString());
 | 
			
		||||
                Log::error($e->getMessage());
 | 
			
		||||
                Log::error($e->getTraceAsString());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -418,7 +418,7 @@ class UserEventHandler
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                app('log')->error(sprintf('Unknown channel "%s" in (user) sendTestNotification method.', $event->channel));
 | 
			
		||||
                Log::error(sprintf('Unknown channel "%s" in (user) sendTestNotification method.', $event->channel));
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -429,28 +429,28 @@ class UserEventHandler
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $message = $e->getMessage();
 | 
			
		||||
            if (str_contains($message, 'Bcc')) {
 | 
			
		||||
                app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (str_contains($message, 'RFC 2822')) {
 | 
			
		||||
                app('log')->warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
                Log::warning('[RFC] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
        Log::debug(sprintf('If you see no errors above this line, test notification was sent over channel "%s"', $event->channel));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function storeUserIPAddress(ActuallyLoggedIn $event): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Now in storeUserIPAddress');
 | 
			
		||||
        Log::debug('Now in storeUserIPAddress');
 | 
			
		||||
        $user       = $event->user;
 | 
			
		||||
 | 
			
		||||
        if ($user->hasRole('demo')) {
 | 
			
		||||
            app('log')->debug('Do not log demo user logins');
 | 
			
		||||
            Log::debug('Do not log demo user logins');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -460,25 +460,25 @@ class UserEventHandler
 | 
			
		||||
            $preference = Preferences::getForUser($user, 'login_ip_history', [])->data;
 | 
			
		||||
        } catch (FireflyException $e) {
 | 
			
		||||
            // don't care.
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        $inArray    = false;
 | 
			
		||||
        $ip         = request()->ip();
 | 
			
		||||
        app('log')->debug(sprintf('User logging in from IP address %s', $ip));
 | 
			
		||||
        Log::debug(sprintf('User logging in from IP address %s', $ip));
 | 
			
		||||
 | 
			
		||||
        // update array if in array
 | 
			
		||||
        foreach ($preference as $index => $row) {
 | 
			
		||||
            if ($row['ip'] === $ip) {
 | 
			
		||||
                app('log')->debug('Found IP in array, refresh time.');
 | 
			
		||||
                Log::debug('Found IP in array, refresh time.');
 | 
			
		||||
                $preference[$index]['time'] = now(config('app.timezone'))->format('Y-m-d H:i:s');
 | 
			
		||||
                $inArray                    = true;
 | 
			
		||||
            }
 | 
			
		||||
            // clean up old entries (6 months)
 | 
			
		||||
            $carbon = Carbon::createFromFormat('Y-m-d H:i:s', $preference[$index]['time']);
 | 
			
		||||
            if ($carbon instanceof Carbon && $carbon->diffInMonths(today(), true) > 6) {
 | 
			
		||||
                app('log')->debug(sprintf('Entry for %s is very old, remove it.', $row['ip']));
 | 
			
		||||
                Log::debug(sprintf('Entry for %s is very old, remove it.', $row['ip']));
 | 
			
		||||
                unset($preference[$index]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ class AccountObserver
 | 
			
		||||
     */
 | 
			
		||||
    public function deleting(Account $account): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of an account.');
 | 
			
		||||
        Log::debug('Observe "deleting" of an account.');
 | 
			
		||||
 | 
			
		||||
        $repository = app(AttachmentRepositoryInterface::class);
 | 
			
		||||
        $repository->setUser($account->user);
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Models\Attachment;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class AttachmentObserver
 | 
			
		||||
@@ -32,7 +33,7 @@ class AttachmentObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(Attachment $attachment): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of an attachment.');
 | 
			
		||||
        Log::debug('Observe "deleting" of an attachment.');
 | 
			
		||||
        $attachment->notes()->delete();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,7 @@ class BillObserver
 | 
			
		||||
        $repository = app(AttachmentRepositoryInterface::class);
 | 
			
		||||
        $repository->setUser($bill->user);
 | 
			
		||||
 | 
			
		||||
        //        app('log')->debug('Observe "deleting" of a bill.');
 | 
			
		||||
        //        Log::debug('Observe "deleting" of a bill.');
 | 
			
		||||
        /** @var Attachment $attachment */
 | 
			
		||||
        foreach ($bill->attachments()->get() as $attachment) {
 | 
			
		||||
            $repository->destroy($attachment);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
use FireflyIII\Models\Attachment;
 | 
			
		||||
use FireflyIII\Models\Category;
 | 
			
		||||
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class CategoryObserver
 | 
			
		||||
@@ -34,7 +35,7 @@ class CategoryObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(Category $category): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a category.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a category.');
 | 
			
		||||
 | 
			
		||||
        $repository = app(AttachmentRepositoryInterface::class);
 | 
			
		||||
        $repository->setUser($category->user);
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ class PiggyBankObserver
 | 
			
		||||
     */
 | 
			
		||||
    public function deleting(PiggyBank $piggyBank): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a piggy bank.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a piggy bank.');
 | 
			
		||||
 | 
			
		||||
        $repository = app(AttachmentRepositoryInterface::class);
 | 
			
		||||
        $repository->setUser($piggyBank->accounts()->first()->user);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
use FireflyIII\Models\Attachment;
 | 
			
		||||
use FireflyIII\Models\Recurrence;
 | 
			
		||||
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class RecurrenceObserver
 | 
			
		||||
@@ -34,7 +35,7 @@ class RecurrenceObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(Recurrence $recurrence): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a recurrence.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a recurrence.');
 | 
			
		||||
 | 
			
		||||
        $repository = app(AttachmentRepositoryInterface::class);
 | 
			
		||||
        $repository->setUser($recurrence->user);
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Models\RecurrenceTransaction;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class RecurrenceTransactionObserver
 | 
			
		||||
@@ -32,7 +33,7 @@ class RecurrenceTransactionObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(RecurrenceTransaction $transaction): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a recurrence transaction.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a recurrence transaction.');
 | 
			
		||||
        $transaction->recurrenceTransactionMeta()->delete();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Models\RuleGroup;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class RuleGroupObserver
 | 
			
		||||
@@ -32,7 +33,7 @@ class RuleGroupObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(RuleGroup $ruleGroup): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a rule group.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a rule group.');
 | 
			
		||||
        foreach ($ruleGroup->rules()->get() as $rule) {
 | 
			
		||||
            $rule->delete();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Models\Rule;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class RuleObserver
 | 
			
		||||
@@ -32,7 +33,7 @@ class RuleObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(Rule $rule): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a rule.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a rule.');
 | 
			
		||||
        $rule->ruleActions()->delete();
 | 
			
		||||
        $rule->ruleTriggers()->delete();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
use FireflyIII\Models\Attachment;
 | 
			
		||||
use FireflyIII\Models\Tag;
 | 
			
		||||
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class TagObserver
 | 
			
		||||
@@ -34,7 +35,7 @@ class TagObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(Tag $tag): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a tag.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a tag.');
 | 
			
		||||
 | 
			
		||||
        $repository = app(AttachmentRepositoryInterface::class);
 | 
			
		||||
        $repository->setUser($tag->user);
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ class TransactionObserver
 | 
			
		||||
 | 
			
		||||
    public function deleting(?Transaction $transaction): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a transaction.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a transaction.');
 | 
			
		||||
        $transaction?->transactionJournal?->delete();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Models\WebhookMessage;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class WebhookMessageObserver
 | 
			
		||||
@@ -32,7 +33,7 @@ class WebhookMessageObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(WebhookMessage $webhookMessage): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a webhook message.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a webhook message.');
 | 
			
		||||
        $webhookMessage->webhookAttempts()->delete();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Handlers\Observer;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Models\Webhook;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class WebhookObserver
 | 
			
		||||
@@ -32,7 +33,7 @@ class WebhookObserver
 | 
			
		||||
{
 | 
			
		||||
    public function deleting(Webhook $webhook): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Observe "deleting" of a webhook.');
 | 
			
		||||
        Log::debug('Observe "deleting" of a webhook.');
 | 
			
		||||
        foreach ($webhook->webhookMessages()->get() as $message) {
 | 
			
		||||
            $message->delete();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -130,7 +130,7 @@ trait AccountCollection
 | 
			
		||||
            $this->query->whereNotIn('source.account_id', $accountIds);
 | 
			
		||||
            $this->query->whereNotIn('destination.account_id', $accountIds);
 | 
			
		||||
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: excludeAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: excludeAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -145,7 +145,7 @@ trait AccountCollection
 | 
			
		||||
            $accountIds = $accounts->pluck('id')->toArray();
 | 
			
		||||
            $this->query->whereNotIn('destination.account_id', $accountIds);
 | 
			
		||||
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: excludeDestinationAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: excludeDestinationAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -160,7 +160,7 @@ trait AccountCollection
 | 
			
		||||
            $accountIds = $accounts->pluck('id')->toArray();
 | 
			
		||||
            $this->query->whereNotIn('source.account_id', $accountIds);
 | 
			
		||||
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: excludeSourceAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: excludeSourceAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -179,7 +179,7 @@ trait AccountCollection
 | 
			
		||||
                    $query->orWhereIn('destination.account_id', $accountIds);
 | 
			
		||||
                }
 | 
			
		||||
            );
 | 
			
		||||
            // app('log')->debug(sprintf('GroupCollector: setAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            // Log::debug(sprintf('GroupCollector: setAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -198,7 +198,7 @@ trait AccountCollection
 | 
			
		||||
                    $query->whereIn('destination.account_id', $accountIds);
 | 
			
		||||
                }
 | 
			
		||||
            );
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: setBothAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: setBothAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -213,7 +213,7 @@ trait AccountCollection
 | 
			
		||||
            $accountIds = $accounts->pluck('id')->toArray();
 | 
			
		||||
            $this->query->whereIn('destination.account_id', $accountIds);
 | 
			
		||||
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: setDestinationAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: setDestinationAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -232,7 +232,7 @@ trait AccountCollection
 | 
			
		||||
                    $query->whereNotIn('destination.account_id', $accountIds);
 | 
			
		||||
                }
 | 
			
		||||
            );
 | 
			
		||||
            // app('log')->debug(sprintf('GroupCollector: setAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            // Log::debug(sprintf('GroupCollector: setAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -247,7 +247,7 @@ trait AccountCollection
 | 
			
		||||
            $accountIds = $accounts->pluck('id')->toArray();
 | 
			
		||||
            $this->query->whereIn('source.account_id', $accountIds);
 | 
			
		||||
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: setSourceAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: setSourceAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
@@ -280,7 +280,7 @@ trait AccountCollection
 | 
			
		||||
                }
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: setXorAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: setXorAccounts: %s', implode(', ', $accountIds)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ use FireflyIII\Models\Attachment;
 | 
			
		||||
use FireflyIII\Models\TransactionJournal;
 | 
			
		||||
use Illuminate\Database\Eloquent\Builder;
 | 
			
		||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Trait AttachmentCollection
 | 
			
		||||
@@ -72,7 +73,7 @@ trait AttachmentCollection
 | 
			
		||||
     */
 | 
			
		||||
    public function hasAttachments(): GroupCollectorInterface
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Add filter on attachment ID.');
 | 
			
		||||
        Log::debug('Add filter on attachment ID.');
 | 
			
		||||
        $this->joinAttachmentTables();
 | 
			
		||||
        $this->query->whereNotNull('attachments.attachable_id');
 | 
			
		||||
        $this->query->whereNull('attachments.deleted_at');
 | 
			
		||||
@@ -510,7 +511,7 @@ trait AttachmentCollection
 | 
			
		||||
     */
 | 
			
		||||
    public function hasNoAttachments(): GroupCollectorInterface
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Add filter on no attachments.');
 | 
			
		||||
        Log::debug('Add filter on no attachments.');
 | 
			
		||||
        $this->joinAttachmentTables();
 | 
			
		||||
 | 
			
		||||
        $this->query->where(static function (Builder $q1): void { // @phpstan-ignore-line
 | 
			
		||||
 
 | 
			
		||||
@@ -320,8 +320,8 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
 | 
			
		||||
    public function dumpQueryInLogs(): void
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug($this->query->select($this->fields)->toSql());
 | 
			
		||||
        app('log')->debug('Bindings', $this->query->getBindings());
 | 
			
		||||
        Log::debug($this->query->select($this->fields)->toSql());
 | 
			
		||||
        Log::debug('Bindings', $this->query->getBindings());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -590,7 +590,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
            $result['created_at']->setTimezone(config('app.timezone'));
 | 
			
		||||
            $result['updated_at']->setTimezone(config('app.timezone'));
 | 
			
		||||
        } catch (Exception $e) { // intentional generic exception
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException($e->getMessage(), 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
@@ -621,7 +621,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
            try {
 | 
			
		||||
                $tagDate = Carbon::parse($augumentedJournal['tag_date']);
 | 
			
		||||
            } catch (InvalidFormatException $e) {
 | 
			
		||||
                app('log')->debug(sprintf('Could not parse date: %s', $e->getMessage()));
 | 
			
		||||
                Log::debug(sprintf('Could not parse date: %s', $e->getMessage()));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $result['tags'][$tagId] = [
 | 
			
		||||
@@ -697,7 +697,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
            try {
 | 
			
		||||
                $tagDate = Carbon::parse($newArray['tag_date']);
 | 
			
		||||
            } catch (InvalidFormatException $e) {
 | 
			
		||||
                app('log')->debug(sprintf('Could not parse date: %s', $e->getMessage()));
 | 
			
		||||
                Log::debug(sprintf('Could not parse date: %s', $e->getMessage()));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $existingJournal['tags'][$tagId] = [
 | 
			
		||||
@@ -783,13 +783,13 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
        if (0 === $countFilters) {
 | 
			
		||||
            return $currentCollection;
 | 
			
		||||
        }
 | 
			
		||||
        app('log')->debug(sprintf('GroupCollector: postFilterCollection has %d filter(s) and %d transaction(s).', count($this->postFilters), count($currentCollection)));
 | 
			
		||||
        Log::debug(sprintf('GroupCollector: postFilterCollection has %d filter(s) and %d transaction(s).', count($this->postFilters), count($currentCollection)));
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @var Closure $function
 | 
			
		||||
         */
 | 
			
		||||
        foreach ($this->postFilters as $function) {
 | 
			
		||||
            app('log')->debug('Applying filter...');
 | 
			
		||||
            Log::debug('Applying filter...');
 | 
			
		||||
            $nextCollection    = new Collection();
 | 
			
		||||
 | 
			
		||||
            // loop everything in the current collection
 | 
			
		||||
@@ -814,7 +814,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            $currentCollection = $nextCollection;
 | 
			
		||||
            app('log')->debug(sprintf('GroupCollector: postFilterCollection has %d transaction(s) left.', count($currentCollection)));
 | 
			
		||||
            Log::debug(sprintf('GroupCollector: postFilterCollection has %d transaction(s) left.', count($currentCollection)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $currentCollection;
 | 
			
		||||
@@ -875,7 +875,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
    public function setLimit(int $limit): GroupCollectorInterface
 | 
			
		||||
    {
 | 
			
		||||
        $this->limit = $limit;
 | 
			
		||||
        // app('log')->debug(sprintf('GroupCollector: The limit is now %d', $limit));
 | 
			
		||||
        // Log::debug(sprintf('GroupCollector: The limit is now %d', $limit));
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
@@ -973,7 +973,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
    {
 | 
			
		||||
        $page       = 0 === $page ? 1 : $page;
 | 
			
		||||
        $this->page = $page;
 | 
			
		||||
        // app('log')->debug(sprintf('GroupCollector: page is now %d', $page));
 | 
			
		||||
        // Log::debug(sprintf('GroupCollector: page is now %d', $page));
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1066,7 +1066,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
     */
 | 
			
		||||
    private function startQuery(): void
 | 
			
		||||
    {
 | 
			
		||||
        // app('log')->debug('GroupCollector::startQuery');
 | 
			
		||||
        // Log::debug('GroupCollector::startQuery');
 | 
			
		||||
        $this->query = $this->user
 | 
			
		||||
            // ->transactionGroups()
 | 
			
		||||
            // ->leftJoin('transaction_journals', 'transaction_journals.transaction_group_id', 'transaction_groups.id')
 | 
			
		||||
@@ -1126,7 +1126,7 @@ class GroupCollector implements GroupCollectorInterface
 | 
			
		||||
     */
 | 
			
		||||
    private function startQueryForGroup(): void
 | 
			
		||||
    {
 | 
			
		||||
        // app('log')->debug('GroupCollector::startQuery');
 | 
			
		||||
        // Log::debug('GroupCollector::startQuery');
 | 
			
		||||
        $this->query = $this->userGroup
 | 
			
		||||
            ->transactionJournals()
 | 
			
		||||
            ->leftJoin('transaction_groups', 'transaction_journals.transaction_group_id', 'transaction_groups.id')
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ use Carbon\Carbon;
 | 
			
		||||
use FireflyIII\Support\Facades\Preferences;
 | 
			
		||||
use Psr\Container\ContainerExceptionInterface;
 | 
			
		||||
use Psr\Container\NotFoundExceptionInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class FiscalHelper.
 | 
			
		||||
@@ -49,7 +50,7 @@ class FiscalHelper implements FiscalHelperInterface
 | 
			
		||||
     */
 | 
			
		||||
    public function endOfFiscalYear(Carbon $date): Carbon
 | 
			
		||||
    {
 | 
			
		||||
        // app('log')->debug(sprintf('Now in endOfFiscalYear(%s).', $date->format('Y-m-d')));
 | 
			
		||||
        // Log::debug(sprintf('Now in endOfFiscalYear(%s).', $date->format('Y-m-d')));
 | 
			
		||||
        $endDate = $this->startOfFiscalYear($date);
 | 
			
		||||
        if (true === $this->useCustomFiscalYear) {
 | 
			
		||||
            // add 1 year and sub 1 day
 | 
			
		||||
@@ -59,7 +60,7 @@ class FiscalHelper implements FiscalHelperInterface
 | 
			
		||||
        if (false === $this->useCustomFiscalYear) {
 | 
			
		||||
            $endDate->endOfYear();
 | 
			
		||||
        }
 | 
			
		||||
        // app('log')->debug(sprintf('Result of endOfFiscalYear(%s) = %s', $date->format('Y-m-d'), $endDate->format('Y-m-d')));
 | 
			
		||||
        // Log::debug(sprintf('Result of endOfFiscalYear(%s) = %s', $date->format('Y-m-d'), $endDate->format('Y-m-d')));
 | 
			
		||||
 | 
			
		||||
        return $endDate;
 | 
			
		||||
    }
 | 
			
		||||
@@ -92,7 +93,7 @@ class FiscalHelper implements FiscalHelperInterface
 | 
			
		||||
            $startDate->startOfYear();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // app('log')->debug(sprintf('Result of startOfFiscalYear(%s) = %s', $date->format('Y-m-d'), $startDate->format('Y-m-d')));
 | 
			
		||||
        // Log::debug(sprintf('Result of startOfFiscalYear(%s) = %s', $date->format('Y-m-d'), $startDate->format('Y-m-d')));
 | 
			
		||||
 | 
			
		||||
        return $startDate;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Helpers\Update;
 | 
			
		||||
 | 
			
		||||
use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequestInterface;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Trait UpdateTrait
 | 
			
		||||
@@ -38,7 +39,7 @@ trait UpdateTrait
 | 
			
		||||
     */
 | 
			
		||||
    public function getLatestRelease(): array
 | 
			
		||||
    {
 | 
			
		||||
        app('log')->debug('Now in getLatestRelease()');
 | 
			
		||||
        Log::debug('Now in getLatestRelease()');
 | 
			
		||||
 | 
			
		||||
        /** @var UpdateRequestInterface $checker */
 | 
			
		||||
        $checker       = app(UpdateRequestInterface::class);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ use Carbon\Carbon;
 | 
			
		||||
use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Models\WebhookMessage;
 | 
			
		||||
use JsonException;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
use function Safe\json_encode;
 | 
			
		||||
 | 
			
		||||
@@ -52,10 +53,10 @@ class Sha3SignatureGenerator implements SignatureGeneratorInterface
 | 
			
		||||
        try {
 | 
			
		||||
            $json = json_encode($message->message, JSON_THROW_ON_ERROR);
 | 
			
		||||
        } catch (JsonException $e) {
 | 
			
		||||
            app('log')->error('Could not generate hash.');
 | 
			
		||||
            app('log')->error(sprintf('JSON value: %s', $json));
 | 
			
		||||
            app('log')->error($e->getMessage());
 | 
			
		||||
            app('log')->error($e->getTraceAsString());
 | 
			
		||||
            Log::error('Could not generate hash.');
 | 
			
		||||
            Log::error(sprintf('JSON value: %s', $json));
 | 
			
		||||
            Log::error($e->getMessage());
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
 | 
			
		||||
            throw new FireflyException('Could not generate JSON for SHA3 hash.', 0, $e);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 | 
			
		||||
 *
 | 
			
		||||
 * @property TransactionCurrency $transactionCurrency
 | 
			
		||||
 * @property Carbon              $start_date
 | 
			
		||||
 * @property Carbon              $end_date
 | 
			
		||||
 * @property null|Carbon         $end_date
 | 
			
		||||
 */
 | 
			
		||||
#[ObservedBy([BudgetLimitObserver::class])]
 | 
			
		||||
class BudgetLimit extends Model
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Rules;
 | 
			
		||||
 | 
			
		||||
use Closure;
 | 
			
		||||
use FireflyIII\Enums\UserRoleEnum;
 | 
			
		||||
use FireflyIII\Exceptions\FireflyException;
 | 
			
		||||
use FireflyIII\Models\Account;
 | 
			
		||||
use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
@@ -68,11 +69,18 @@ class IsAllowedGroupAction implements ValidationRule
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        $this->validateUserGroup((int) $value, $fail);
 | 
			
		||||
        $this->validateUserGroup((int)$value, $fail);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function validateUserGroup(int $userGroupId, Closure $fail): void
 | 
			
		||||
    {
 | 
			
		||||
        try {
 | 
			
		||||
            throw new FireflyException('Here we are');
 | 
			
		||||
        } catch (FireflyException $e) {
 | 
			
		||||
            Log::error($e->getTraceAsString());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        exit('here we are');
 | 
			
		||||
        Log::debug(sprintf('validateUserGroup: %s', static::class));
 | 
			
		||||
        if (!auth()->check()) {
 | 
			
		||||
            Log::debug('validateUserGroup: user is not logged in, return NULL.');
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										56
									
								
								app/Rules/TransactionType/IsValidTransactionTypeList.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								app/Rules/TransactionType/IsValidTransactionTypeList.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IsValidAccountType.php
 | 
			
		||||
 * Copyright (c) 2024 james@firefly-iii.org.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of Firefly III (https://github.com/firefly-iii).
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see https://www.gnu.org/licenses/.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace FireflyIII\Rules\TransactionType;
 | 
			
		||||
 | 
			
		||||
use Closure;
 | 
			
		||||
use FireflyIII\Support\Http\Api\TransactionFilter;
 | 
			
		||||
use Illuminate\Contracts\Validation\ValidationRule;
 | 
			
		||||
use Override;
 | 
			
		||||
 | 
			
		||||
class IsValidTransactionTypeList implements ValidationRule
 | 
			
		||||
{
 | 
			
		||||
    use TransactionFilter;
 | 
			
		||||
 | 
			
		||||
    #[Override]
 | 
			
		||||
    public function validate(string $attribute, mixed $value, Closure $fail): void
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        // only check the type.
 | 
			
		||||
        $values = [];
 | 
			
		||||
        if (is_string($value)) {
 | 
			
		||||
            $values = explode(',', $value);
 | 
			
		||||
        }
 | 
			
		||||
        if (!is_array($values)) {
 | 
			
		||||
            $fail('validation.invalid_transaction_type_list')->translate();
 | 
			
		||||
        }
 | 
			
		||||
        $keys   = array_keys($this->transactionTypes);
 | 
			
		||||
        foreach ($values as $entry) {
 | 
			
		||||
            $entry = (string)$entry;
 | 
			
		||||
            if (!in_array($entry, $keys, true)) {
 | 
			
		||||
                $fail('validation.invalid_transaction_type_list')->translate();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
 | 
			
		||||
namespace FireflyIII\Support;
 | 
			
		||||
 | 
			
		||||
use Carbon\Carbon;
 | 
			
		||||
use FireflyIII\Support\Facades\Steam;
 | 
			
		||||
use Illuminate\Support\Collection;
 | 
			
		||||
use Illuminate\Support\Facades\Cache;
 | 
			
		||||
use JsonException;
 | 
			
		||||
@@ -44,6 +45,7 @@ class CacheProperties
 | 
			
		||||
        if (auth()->check()) {
 | 
			
		||||
            $this->addProperty(auth()->user()->id);
 | 
			
		||||
            $this->addProperty(app('preferences')->lastActivity());
 | 
			
		||||
            $this->addProperty(Steam::anonymous());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,39 +31,48 @@ use FireflyIII\Enums\TransactionTypeEnum;
 | 
			
		||||
 */
 | 
			
		||||
trait TransactionFilter
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * All the types you can request.
 | 
			
		||||
     */
 | 
			
		||||
    protected function mapTransactionTypes(string $type): array
 | 
			
		||||
    {
 | 
			
		||||
        $types  = [
 | 
			
		||||
            'all'             => [
 | 
			
		||||
    protected $transactionTypes
 | 
			
		||||
        = [
 | 
			
		||||
            'all'                                       => [
 | 
			
		||||
                TransactionTypeEnum::WITHDRAWAL->value,
 | 
			
		||||
                TransactionTypeEnum::DEPOSIT->value,
 | 
			
		||||
                TransactionTypeEnum::TRANSFER->value,
 | 
			
		||||
                TransactionTypeEnum::OPENING_BALANCE->value,
 | 
			
		||||
                TransactionTypeEnum::RECONCILIATION->value,
 | 
			
		||||
            ],
 | 
			
		||||
            'withdrawal'      => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'withdrawals'     => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'expense'         => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'expenses'        => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'income'          => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            'deposit'         => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            'deposits'        => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            'transfer'        => [TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
            'transfers'       => [TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
            'opening_balance' => [TransactionTypeEnum::OPENING_BALANCE->value],
 | 
			
		||||
            'reconciliation'  => [TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'reconciliations' => [TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'special'         => [TransactionTypeEnum::OPENING_BALANCE->value, TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'specials'        => [TransactionTypeEnum::OPENING_BALANCE->value, TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'default'         => [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
            TransactionTypeEnum::WITHDRAWAL->value      => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'withdrawal'                                => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'withdrawals'                               => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'expense'                                   => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            'expenses'                                  => [TransactionTypeEnum::WITHDRAWAL->value],
 | 
			
		||||
            TransactionTypeEnum::DEPOSIT->value         => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            'income'                                    => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            'deposit'                                   => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            'deposits'                                  => [TransactionTypeEnum::DEPOSIT->value],
 | 
			
		||||
            TransactionTypeEnum::TRANSFER->value        => [TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
            'transfer'                                  => [TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
            'transfers'                                 => [TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
            TransactionTypeEnum::OPENING_BALANCE->value => [TransactionTypeEnum::OPENING_BALANCE->value],
 | 
			
		||||
            'opening_balance'                           => [TransactionTypeEnum::OPENING_BALANCE->value],
 | 
			
		||||
            TransactionTypeEnum::RECONCILIATION->value  => [TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'reconciliation'                            => [TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'reconciliations'                           => [TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'special'                                   => [TransactionTypeEnum::OPENING_BALANCE->value, TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'specials'                                  => [TransactionTypeEnum::OPENING_BALANCE->value, TransactionTypeEnum::RECONCILIATION->value],
 | 
			
		||||
            'default'                                   => [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value],
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * All the types you can request.
 | 
			
		||||
     */
 | 
			
		||||
    protected function mapTransactionTypes(string $type): array
 | 
			
		||||
    {
 | 
			
		||||
        $return = [];
 | 
			
		||||
        $parts  = explode(',', $type);
 | 
			
		||||
        foreach ($parts as $part) {
 | 
			
		||||
            $return = array_merge($return, $types[$part] ?? $types['default']);
 | 
			
		||||
            if (array_key_exists($part, $this->transactionTypes)) {
 | 
			
		||||
                $return = array_merge($return, $this->transactionTypes[$part]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return array_unique($return);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ use FireflyIII\Models\TransactionJournal;
 | 
			
		||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
 | 
			
		||||
use FireflyIII\User;
 | 
			
		||||
use Illuminate\Support\Facades\DB;
 | 
			
		||||
use Illuminate\Support\Facades\Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class LinkToBill.
 | 
			
		||||
@@ -54,29 +55,16 @@ class LinkToBill implements ActionInterface
 | 
			
		||||
        $bill       = $repository->findByName($billName);
 | 
			
		||||
 | 
			
		||||
        if (null !== $bill && TransactionTypeEnum::WITHDRAWAL->value === $journal['transaction_type_type']) {
 | 
			
		||||
            $count  = DB::table('transaction_journals')->where('id', '=', $journal['transaction_journal_id'])
 | 
			
		||||
                ->where('bill_id', $bill->id)->count()
 | 
			
		||||
            ;
 | 
			
		||||
            $count  = DB::table('transaction_journals')->where('id', '=', $journal['transaction_journal_id'])->where('bill_id', $bill->id)->count();
 | 
			
		||||
            if (0 !== $count) {
 | 
			
		||||
                app('log')->error(
 | 
			
		||||
                    sprintf(
 | 
			
		||||
                        'RuleAction LinkToBill could not set the bill of journal #%d to bill "%s": already set.',
 | 
			
		||||
                        $journal['transaction_journal_id'],
 | 
			
		||||
                        $billName
 | 
			
		||||
                    )
 | 
			
		||||
                );
 | 
			
		||||
                event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.already_linked_to_subscription', ['name' => $billName])));
 | 
			
		||||
                Log::error(sprintf('RuleAction LinkToBill could not set the bill of journal #%d to bill "%s": already set.', $journal['transaction_journal_id'], $billName));
 | 
			
		||||
                // event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.already_linked_to_subscription', ['name' => $billName])));
 | 
			
		||||
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            DB::table('transaction_journals')
 | 
			
		||||
                ->where('id', '=', $journal['transaction_journal_id'])
 | 
			
		||||
                ->update(['bill_id' => $bill->id])
 | 
			
		||||
            ;
 | 
			
		||||
            app('log')->debug(
 | 
			
		||||
                sprintf('RuleAction LinkToBill set the bill of journal #%d to bill #%d ("%s").', $journal['transaction_journal_id'], $bill->id, $bill->name)
 | 
			
		||||
            );
 | 
			
		||||
            DB::table('transaction_journals')->where('id', '=', $journal['transaction_journal_id'])->update(['bill_id' => $bill->id]);
 | 
			
		||||
            Log::debug(sprintf('RuleAction LinkToBill set the bill of journal #%d to bill #%d ("%s").', $journal['transaction_journal_id'], $bill->id, $bill->name));
 | 
			
		||||
 | 
			
		||||
            /** @var TransactionJournal $object */
 | 
			
		||||
            $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']);
 | 
			
		||||
@@ -85,13 +73,7 @@ class LinkToBill implements ActionInterface
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        app('log')->error(
 | 
			
		||||
            sprintf(
 | 
			
		||||
                'RuleAction LinkToBill could not set the bill of journal #%d to bill "%s": no such bill found or not a withdrawal.',
 | 
			
		||||
                $journal['transaction_journal_id'],
 | 
			
		||||
                $billName
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
        Log::error(sprintf('RuleAction LinkToBill could not set the bill of journal #%d to bill "%s": no such bill found or not a withdrawal.', $journal['transaction_journal_id'], $billName));
 | 
			
		||||
        event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_subscription', ['name' => $billName])));
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -239,7 +239,7 @@ class UpdatePiggyBank implements ActionInterface
 | 
			
		||||
        if (false === $repository->canAddAmount($piggyBank, $account, $amount)) {
 | 
			
		||||
            Log::warning(sprintf('Cannot add %s to piggy bank.', $amount));
 | 
			
		||||
            $currency = $accountRepository->getAccountCurrency($account) ?? Amount::getPrimaryCurrency();
 | 
			
		||||
            event(new RuleActionFailedOnArray($this->action, $array, trans('rules.cannot_add_to_piggy', ['amount' => Amount::formatAnything($amount, $currency, false), 'name' => $piggyBank->name])));
 | 
			
		||||
            event(new RuleActionFailedOnArray($this->action, $array, trans('rules.cannot_add_to_piggy', ['amount' => Amount::formatAnything($currency, $amount, false), 'name' => $piggyBank->name])));
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,12 @@
 | 
			
		||||
All notable changes to this project will be documented in this file.
 | 
			
		||||
This project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
 | 
			
		||||
## 6.4.5 - 2025-11-xx
 | 
			
		||||
 | 
			
		||||
### Fixed
 | 
			
		||||
 | 
			
		||||
- [Issue 11157](https://github.com/firefly-iii/firefly-iii/issues/11157) (Redacted amounts misbehave with Reports) reported by @barreeeiroo
 | 
			
		||||
 | 
			
		||||
## 6.4.4 - 2025-11-02
 | 
			
		||||
 | 
			
		||||
### Added
 | 
			
		||||
 
 | 
			
		||||
@@ -78,8 +78,8 @@ return [
 | 
			
		||||
        'running_balance_column' => env('USE_RUNNING_BALANCE', false),
 | 
			
		||||
        // see cer.php for exchange rates feature flag.
 | 
			
		||||
    ],
 | 
			
		||||
    'version'                      => 'develop/2025-11-01',
 | 
			
		||||
    'build_time'                   => 1762025863,
 | 
			
		||||
    'version'                      => 'develop/2025-11-03',
 | 
			
		||||
    'build_time'                   => 1762140500,
 | 
			
		||||
    'api_version'                  => '2.1.0', // field is no longer used.
 | 
			
		||||
    'db_version'                   => 28, // field is no longer used.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										232
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										232
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1693,9 +1693,9 @@
 | 
			
		||||
            "license": "MIT"
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/aix-ppc64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "ppc64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1710,9 +1710,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/android-arm": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1727,9 +1727,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/android-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1744,9 +1744,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/android-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1761,9 +1761,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/darwin-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1778,9 +1778,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/darwin-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1795,9 +1795,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/freebsd-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1812,9 +1812,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/freebsd-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1829,9 +1829,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-arm": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1846,9 +1846,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1863,9 +1863,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-ia32": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "ia32"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1880,9 +1880,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-loong64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "loong64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1897,9 +1897,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-mips64el": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "mips64el"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1914,9 +1914,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-ppc64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "ppc64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1931,9 +1931,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-riscv64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "riscv64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1948,9 +1948,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-s390x": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "s390x"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1965,9 +1965,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/linux-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1982,9 +1982,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/netbsd-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -1999,9 +1999,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/netbsd-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2016,9 +2016,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/openbsd-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2033,9 +2033,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/openbsd-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2050,9 +2050,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/openharmony-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2067,9 +2067,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/sunos-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2084,9 +2084,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/win32-arm64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "arm64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2101,9 +2101,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/win32-ia32": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "ia32"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -2118,9 +2118,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@esbuild/win32-x64": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
 | 
			
		||||
            "cpu": [
 | 
			
		||||
                "x64"
 | 
			
		||||
            ],
 | 
			
		||||
@@ -3173,9 +3173,9 @@
 | 
			
		||||
            "license": "MIT"
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@types/node": {
 | 
			
		||||
            "version": "24.9.2",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz",
 | 
			
		||||
            "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==",
 | 
			
		||||
            "version": "24.10.0",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
 | 
			
		||||
            "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==",
 | 
			
		||||
            "dev": true,
 | 
			
		||||
            "license": "MIT",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
@@ -4521,9 +4521,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/caniuse-lite": {
 | 
			
		||||
            "version": "1.0.30001752",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz",
 | 
			
		||||
            "integrity": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==",
 | 
			
		||||
            "version": "1.0.30001753",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz",
 | 
			
		||||
            "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==",
 | 
			
		||||
            "dev": true,
 | 
			
		||||
            "funding": [
 | 
			
		||||
                {
 | 
			
		||||
@@ -5820,9 +5820,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/envinfo": {
 | 
			
		||||
            "version": "7.19.0",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.19.0.tgz",
 | 
			
		||||
            "integrity": "sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw==",
 | 
			
		||||
            "version": "7.20.0",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz",
 | 
			
		||||
            "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==",
 | 
			
		||||
            "dev": true,
 | 
			
		||||
            "license": "MIT",
 | 
			
		||||
            "bin": {
 | 
			
		||||
@@ -5899,9 +5899,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/esbuild": {
 | 
			
		||||
            "version": "0.25.11",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz",
 | 
			
		||||
            "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==",
 | 
			
		||||
            "version": "0.25.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
 | 
			
		||||
            "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
 | 
			
		||||
            "dev": true,
 | 
			
		||||
            "hasInstallScript": true,
 | 
			
		||||
            "license": "MIT",
 | 
			
		||||
@@ -5912,32 +5912,32 @@
 | 
			
		||||
                "node": ">=18"
 | 
			
		||||
            },
 | 
			
		||||
            "optionalDependencies": {
 | 
			
		||||
                "@esbuild/aix-ppc64": "0.25.11",
 | 
			
		||||
                "@esbuild/android-arm": "0.25.11",
 | 
			
		||||
                "@esbuild/android-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/android-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/darwin-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/darwin-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/freebsd-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/freebsd-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-arm": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-ia32": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-loong64": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-mips64el": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-ppc64": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-riscv64": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-s390x": "0.25.11",
 | 
			
		||||
                "@esbuild/linux-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/netbsd-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/netbsd-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/openbsd-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/openbsd-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/openharmony-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/sunos-x64": "0.25.11",
 | 
			
		||||
                "@esbuild/win32-arm64": "0.25.11",
 | 
			
		||||
                "@esbuild/win32-ia32": "0.25.11",
 | 
			
		||||
                "@esbuild/win32-x64": "0.25.11"
 | 
			
		||||
                "@esbuild/aix-ppc64": "0.25.12",
 | 
			
		||||
                "@esbuild/android-arm": "0.25.12",
 | 
			
		||||
                "@esbuild/android-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/android-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/darwin-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/darwin-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/freebsd-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/freebsd-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-arm": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-ia32": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-loong64": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-mips64el": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-ppc64": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-riscv64": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-s390x": "0.25.12",
 | 
			
		||||
                "@esbuild/linux-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/netbsd-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/netbsd-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/openbsd-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/openbsd-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/openharmony-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/sunos-x64": "0.25.12",
 | 
			
		||||
                "@esbuild/win32-arm64": "0.25.12",
 | 
			
		||||
                "@esbuild/win32-ia32": "0.25.12",
 | 
			
		||||
                "@esbuild/win32-x64": "0.25.12"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/escalade": {
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
return [
 | 
			
		||||
    'invalid_account_list' => 'Invalid account type list',
 | 
			
		||||
    'invalid_transaction_type_list' => 'Invalid transaction type list',
 | 
			
		||||
    'limit_exists'                   => 'There is already a budget limit (amount) for this budget and currency in the given period.',
 | 
			
		||||
    'invalid_sort_instruction'       => 'The sort instruction is invalid for an object of type ":object".',
 | 
			
		||||
    'invalid_sort_instruction_index' => 'The sort instruction at index #:index is invalid for an object of type ":object".',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user