. */ declare(strict_types=1); namespace FireflyIII\Providers; use Exception; use FireflyIII\Events\ActuallyLoggedIn; use FireflyIII\Events\AdminRequestedTestMessage; use FireflyIII\Events\DestroyedTransactionGroup; use FireflyIII\Events\DetectedNewIPAddress; use FireflyIII\Events\RegisteredUser; use FireflyIII\Events\RequestedNewPassword; use FireflyIII\Events\RequestedReportOnJournals; use FireflyIII\Events\RequestedSendWebhookMessages; use FireflyIII\Events\RequestedVersionCheckStatus; use FireflyIII\Events\StoredAccount; use FireflyIII\Events\StoredTransactionGroup; use FireflyIII\Events\UpdatedAccount; use FireflyIII\Events\UpdatedTransactionGroup; use FireflyIII\Events\UserChangedEmail; use FireflyIII\Events\WarnUserAboutBill; use FireflyIII\Mail\OAuthTokenCreatedMail; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankRepetition; use FireflyIII\Notifications\Admin\TestNotification; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface; use Illuminate\Auth\Events\Login; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Notification; use Laravel\Passport\Client; use Laravel\Passport\Events\AccessTokenCreated; use Log; use Mail; use Session; use TypeError; /** * Class EventServiceProvider. * * @codeCoverageIgnore */ class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ // is a User related event. RegisteredUser::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendRegistrationMail', 'FireflyIII\Handlers\Events\UserEventHandler@attachUserRole', 'FireflyIII\Handlers\Events\UserEventHandler@createGroupMembership', 'FireflyIII\Handlers\Events\UserEventHandler@createExchangeRates', ], // is a User related event. Login::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@checkSingleUserIsAdmin', 'FireflyIII\Handlers\Events\UserEventHandler@demoUserBackToEnglish', ], ActuallyLoggedIn::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@storeUserIPAddress', ], DetectedNewIPAddress::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@notifyNewIPAddress', ], RequestedVersionCheckStatus::class => [ 'FireflyIII\Handlers\Events\VersionCheckEventHandler@checkForUpdates', ], RequestedReportOnJournals::class => [ 'FireflyIII\Handlers\Events\AutomationHandler@reportJournals', ], // is a User related event. RequestedNewPassword::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendNewPassword', ], // is a User related event. UserChangedEmail::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendEmailChangeConfirmMail', 'FireflyIII\Handlers\Events\UserEventHandler@sendEmailChangeUndoMail', ], // admin related AdminRequestedTestMessage::class => [ 'FireflyIII\Handlers\Events\AdminEventHandler@sendTestMessage', ], // is a Transaction Journal related event. StoredTransactionGroup::class => [ 'FireflyIII\Handlers\Events\StoredGroupEventHandler@processRules', 'FireflyIII\Handlers\Events\StoredGroupEventHandler@recalculateCredit', 'FireflyIII\Handlers\Events\StoredGroupEventHandler@triggerWebhooks', ], // is a Transaction Journal related event. UpdatedTransactionGroup::class => [ 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@unifyAccounts', 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@processRules', 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@recalculateCredit', 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@triggerWebhooks', ], DestroyedTransactionGroup::class => [ 'FireflyIII\Handlers\Events\DestroyedGroupEventHandler@triggerWebhooks', ], // API related events: AccessTokenCreated::class => [ 'FireflyIII\Handlers\Events\APIEventHandler@accessTokenCreated', ], // Webhook related event: RequestedSendWebhookMessages::class => [ 'FireflyIII\Handlers\Events\WebhookEventHandler@sendWebhookMessages', ], // account related events: StoredAccount::class => [ 'FireflyIII\Handlers\Events\StoredAccountEventHandler@recalculateCredit', ], UpdatedAccount::class => [ 'FireflyIII\Handlers\Events\UpdatedAccountEventHandler@recalculateCredit', ], // bill related events: WarnUserAboutBill::class => [ 'FireflyIII\Handlers\Events\BillEventHandler@warnAboutBill', ], ]; /** * Register any events for your application. */ public function boot(): void { parent::boot(); $this->registerCreateEvents(); $this->registerBudgetEvents(); } /** * TODO needs a dedicated method. */ protected function registerBudgetEvents(): void { $func = static function (BudgetLimit $limit) { Log::debug('Trigger budget limit event.'); // find available budget with same period and same currency or create it. // then set it or add money: $user = $limit->budget->user; $availableBudget = $user ->availableBudgets() ->where('start_date', $limit->start_date->format('Y-m-d')) ->where('end_date', $limit->end_date->format('Y-m-d')) ->where('transaction_currency_id', $limit->transaction_currency_id) ->first(); // update! if (null !== $availableBudget) { $repository = app(BudgetLimitRepositoryInterface::class); $repository->setUser($user); $set = $repository->getAllBudgetLimitsByCurrency($limit->transactionCurrency, $limit->start_date, $limit->end_date); $sum = (string) $set->sum('amount'); Log::debug(sprintf('Because budget limit #%d had its amount changed to %s, available budget limit #%d will be updated.', $limit->id, $limit->amount, $availableBudget->id)); $availableBudget->amount = $sum; $availableBudget->save(); return; } Log::debug('Does not exist, create it.'); // create it. $data = [ 'amount' => $limit->amount, 'start' => $limit->start_date, 'end' => $limit->end_date, 'currency_id' => $limit->transaction_currency_id, ]; $repository = app(AvailableBudgetRepositoryInterface::class); $repository->setUser($user); $repository->store($data); }; BudgetLimit::created($func); BudgetLimit::updated($func); } /** * TODO needs a dedicated (static) method. */ protected function registerCreateEvents(): void { PiggyBank::created( static function (PiggyBank $piggyBank) { $repetition = new PiggyBankRepetition; $repetition->piggyBank()->associate($piggyBank); $repetition->startdate = $piggyBank->startdate; $repetition->targetdate = $piggyBank->targetdate; $repetition->currentamount = 0; $repetition->save(); } ); } }