Skip to content

Inventura e-mailů a notifikací

Přehled všech notifikací v app/Notifications/. Ke každé je uvedeno, čím se spouští, komu chodí a co obsahuje. Dopady na ochranu osobních údajů řeší samostatná stránka GDPR: e-maily a notifikace.

  • Kanály určuje metoda via(). Používáme mail, slack a database.
  • Frontu má 58 tříd (implementují ShouldQueue). Nefrontované jsou hlavně Slack reporty z konzolových příkazů a několik e-mailů posílaných synchronně.
  • Adresa odesílatele je MAIL_FROM_ADDRESS (výchozí [email protected]). Vlastní odesílatele má jen Moderator\CandidateWelcome ([email protected]).
  • Příjemce se odvozuje buď z notifiable modelu (User, TeamReservation, AlternateReservation, ModeratorCandidate, ChangeRequest), nebo z adresy předané přes Notification::route('mail', ...).

Každý odchozí e-mail má stabilní identifikátor ve tvaru SKUPINA-ČÍSLO (RES-01, ESH-03). Zdrojem pravdy je App\Support\MailPreview\MailCatalog, sloupec ID v tabulkách výše z něj vychází.

Identifikátor se do zprávy dostává dvěma způsoby:

  • hlavička X-CHK-Mail-Id je ve všech odeslaných zprávách včetně produkčních, přidává ji listener StampMailIdentifier na události MessageSending;
  • předmět dostane prefix [RES-01] pouze při kontrolním odeslání, produkční zprávy zákazníkům zůstávají beze změny.
Terminal window
# všechny e-maily na jednu adresu
php artisan mail:preview [email protected]
# jen inventář, nic se neodesílá
php artisan mail:preview --list
# jedna skupina nebo konkrétní zprávy
php artisan mail:preview --group=RES [email protected]
php artisan mail:preview --only=RES-01,ESH-03 [email protected]
# včetně tříd, které v aplikaci nikdo neodesílá
php artisan mail:preview --all [email protected]

Ukázková data staví PreviewSamples: modely se jen instancují, doplní se jim vymyšlené hodnoty a falešná ID kvůli generování odkazů, ale nikdy se neukládají. Všechny zprávy navíc přesměruje Mail::alwaysTo(), takže se ani při chybě v katalogu nemůže nic dostat ke skutečnému zákazníkovi. Příkaz je proto bezpečné pustit i na produkci.

Nová notifikace s metodou toMail() musí přibýt i do katalogu, jinak spadne tests/Feature/Mail/MailCatalogTest.php.

E-mailové notifikace pro zákazníky a hráče

Section titled “E-mailové notifikace pro zákazníky a hráče”
ID Notifikace Spouštěč Příjemce Obsah e-mailu
RES-01 Reservation\ReservationConfirmed ReservationObserver::created(), restored() e-mail z rezervace datum, podnik, název týmu, e-mail, telefon, počet hráčů, poznámka, odkaz na zrušení (token)
RES-02 Reservation\ReservationCancelled ReservationObserver::deleted(), AlternateReservationObserver::deleted() e-mail z rezervace potvrzení odhlášení týmu, datum a místo
RES-03 Reservation\ReservationReminder TeamReservation::sendReminder() z příkazu RemindReservations e-mail z rezervace připomínka den předem, odkaz na odhlášení (token)
RES-04 Reservation\ReservationInvited job InviteAlternateReservations (uvolněná kapacita) náhradní rezervace výzva „uvolnilo se místo”, odkaz na přihlášení (token)
RES-05 Reservation\AlternateReservationConfirmed AlternateReservationObserver::created() e-mail náhradní rezervace potvrzení hlídacího psa na daný kvíz
RES-06, RES-07 Reservation\StandingConfirmationRequested TeamReservation::sendStandingConfirmationRequest() z příkazu RequireStandingConfirmation e-mail z rezervace výzva k potvrzení účasti (72 h, upomínka 48 h), tlačítka s počtem hráčů, odkaz na zrušení
RES-08 Reservation\StandingReservationAutoCancelled TeamReservation::cancelUnconfirmed() e-mail z rezervace oznámení o automatickém zrušení nepotvrzené rezervace
RES-09 Reservation\StandingReservationPermanentlyCancelled TeamReservation::cancelUnconfirmed() po třetím nepotvrzení e-mail z rezervace trvalé zrušení stálé rezervace
RES-10 Reservation\StandingReservationCreatedNotification StandingReservationObserver::created() manažer týmu zapnutí autorezervace, tým, kvíz, odkaz na zrušení
RES-11 Reservation\StandingReservationRevokedNotification StandingReservationObserver::deleted() manažer týmu zrušení autorezervace
RES-12 Reservation\EventCanceled QuizzEventObserver::updated() rezervace i náhradní rezervace události zrušení události, datum, podnik, adresa, název týmu
RES-13 Reservation\OnboardAnonymous QuizzEventObserver::updated() při přechodu do stavu COMPLETED anonymní rezervace s výsledkem poděkování, body a umístění týmu, podepsaný odkaz na registraci (14 dní)
RES-16 Reservation\EventDateChanged QuizzEventObserver::updated(), job QuizzBlueprint\PostUpdateBrief rezervace i náhradní rezervace události změna termínu, nový termín tučně, původní termín, podnik, adresa, název týmu, u rezervace tlačítko k odhlášení
HRA-01 League\LeagueWinnerNotification Admin\LeagueWinnerController hráč (User) oznámení o výhře v lize, odkaz na profil pro převzetí (kanály mail + database); modul výherců je skrytý, viz Nepoužívané
HRA-02 Player\FeedbackReceived Web\Player\FeedbackController přihlášený hráč poděkování za hodnocení, podnik, datum a čas kvízu
HRA-03 TeamInvitation\SelfInvitation TeamInvitationRequestObserver manažer týmu jméno žadatele o vstup do týmu, odkaz na správu žádostí
FRM-07 Mailing\NewsletterConfirmSubscription Web\NewsletterSubscriptionController zadaná adresa potvrzení odběru novinek (double opt-in), odkaz s tokenem
FRM-01 Contact\ContactMessageConfirmation Web\HomeController odesílatel formuláře kopie předmětu a textu vlastní zprávy
FRM-03 Career\JobApplicationConfirmation Web\HomeController uchazeč pozice, jméno, telefon
FRM-05 Company\CompanyInquiryConfirmation Web\CompanyInquiryController poptávající shrnutí poptávky: jméno a firma, termín, místo, odhad hráčů

Všech sedm e-mailů posílá OrderObserver podle stavu objednávky na adresu z orderAddress->email. Objednávku bez adresy observer přeskočí.

ID Notifikace Stav objednávky Obsah e-mailu
ESH-01 Eshop\OrderConfirmed NEW (a ShoppingCart::saveOrder()) číslo objednávky, datum, cena, tabulka položek, odkaz na detail (hash)
ESH-02 Eshop\OrderAwaitingPayment AWAITING_PAYMENT číslo, cena, způsob platby, položky, odkaz na QR platbu
ESH-03 Eshop\OrderProcessing PROCESSING potvrzení platby, položky, odkaz na detail
ESH-04 Eshop\OrderSent SENT datum odeslání, položky, odkaz na detail
ESH-05 Eshop\OrderFinished FINISHED dokončení objednávky, výzva ke zpětné vazbě
ESH-06 Eshop\OrderCancelled CANCELLED storno, informace o vrácení peněz, položky
ESH-07 Eshop\OrderReturned RETURNED přijetí vrácení, informace o refundaci, položky
ID Notifikace Spouštěč Příjemce Obsah e-mailu
MOD-01 Moderator\AddedAsModerator ModerableObserver::created() přidaný moderátor název předpisu, nejbližší událost
MOD-02 Moderator\EventCanceled QuizzEventObserver::updated(), job PostUpdateBrief moderátoři události zrušení události včetně termínu
MOD-03 Moderator\EventDateChanged QuizzEventObserver::updated() moderátoři události původní a nový termín
MOD-04 QuizzBlueprint\PostUpdateBrief joby PostUpdateBrief, SyncDayOfWeek, SyncFrequency, SyncTimes moderátoři předpisu změna doby konání předpisu (kanály mail + slack)
MOD-05 Moderator\CandidateWelcome Web\ModeratorController, Livewire\Moderator\CandidateForm, job SendQuestionnaireMailToModeratorCandidate kandidát na moderátora poděkování za přihlášku, odesílatel [email protected]
HRA-04 Moderator\TeamCaptainInvitation Livewire\ResultsEntry nově založený kapitán registrace kapitána týmu, podepsaný odkaz platný týden
MOD-06 Moderator\SpringReleaseNotification bez volajícího v kódu, jednorázová kampaň moderátoři novinky panelu jaro 2026 ve sdílené šabloně, tlačítka do panelu a na průvodce
ID Notifikace Spouštěč Příjemce Obsah e-mailu
TOP-01 Topic\ReturnedToAuthor TopicAuditObserver autor tématu vrácení k přepracování, odkaz na editaci (mail + database)
TOP-02 Topic\ReturnedToAudit TopicAuditObserver auditor vrácení tématu k auditu (mail + database)
TOP-03 Topic\TopicApproved TopicAuditObserver autor tématu schválení tématu a informace o odměně
TOP-04 Topic\TopicRejected TopicAuditObserver autor tématu zamítnutí tématu, odkaz na komentáře (mail + database)
TOP-05 Commentable\Topic\CommentAdded TopicCommentsObserver autor tématu text komentáře a jméno jeho autora
ID Notifikace Spouštěč Příjemce Obsah e-mailu
UCT-01 Auth\ResetPassword User::sendPasswordResetNotification() uživatel odkaz na reset hesla
UCT-02 Admin\UserCreatedFromAdmin Livewire\User\UsersForm nový uživatel podepsaný odkaz na dokončení registrace (týden)
PRO-01 Admin\AdminMessage Admin\GeneralFeedbackController::submitReply() autor feedbacku volný předmět a HTML text napsaný adminem
PRO-02 Admin\AccountingReportReadyNotification job ProcessAccountingReport uživatelé zvolení v options.notify_users název procesoru, odkaz na stažení reportu
FRM-02 Admin\ContactMessageReceived Web\HomeController config('kviz.admin_email') jméno, e-mail, předmět a text zprávy odesílatele
FRM-04 Admin\JobApplicationReceived Web\HomeController config('kviz.admin_email') pozice, jméno, e-mail, telefon a zpráva uchazeče (životopis se nepřikládá, zůstává v úložišti)
FRM-06 Company\CompanyInquiryReceived Web\CompanyInquiryController kontaktní e-mail z CompanyPageSettings celá poptávka včetně telefonu, e-mailu a poznámek, odkaz do CRM
PRO-03 ChangeRequest\ChangeRequested ChangeRequestObserver::created() autor žádosti (routeNotificationForMail) text žádosti (kanály mail + slack)
PRO-04 ChangeRequest\ChangeRequestResolved ChangeRequestObserver::updated() autor žádosti text žádosti, jméno řešitele, odpověď (mail + database)
UCT-03 User\UserMerged příkaz MergeUsers cílový účet jméno a e-mail slučovaného účtu, příloha merge_log.json
UCT-04 User\AccountDeletedDueToMerge příkaz MergeUsers rušený účet oznámení o smazání účtu, příloha merge_log.json

Kanály se berou z config('services.slack.notifications.*'): channel (provozní), secondaryChannel (sekundární) a adminDevChannel (vývoj).

Notifikace Spouštěč Kanál Obsah
Internal\QuizzDownloaded Admin\ModeratorController provozní kdo stáhl kvíz, název kvízu, konfigurace, telefon a e-mail moderátora
Internal\ResultEntered listener PaymentForModeration provozní kvíz, počet hráčů, poznámka, jméno a e-mail moderátora, pokuta
Internal\GenericSlackNotification Modules\Download, Modules\GeneralFeedback provozní obecné hlášky, například překročení limitu stažení
Internal\ErrorWhileConfigGeneration, Internal\ErrorWhileZipGenerating příkaz GenerateConfigs provozní technické chyby generování
Internal\ConfigsNotPreparedNotification příkaz CheckQuizzConfigs provozní nepřipravené konfigurace (u uživatele i kanál database)
Internal\ConfigMigrationReportNotification příkaz QuizzConfigMigrationReport sekundární report migrace konfigurací
Internal\ChangelogReleased příkaz AnnounceChangelog vývojový vydání changelogu
Health\Report příkaz Health\MakeReport, HealthService sekundární zdravotní report systému
GameplayReport příkaz SendWeeklyTopicRecord adresát v příkazu týdenní report témat
Finance\PaymentError TopicPaymentCalculator provozní chyba výpočtu odměny za téma
VoucherRedeemed VoucherService sekundární uplatněný voucher, tým, jméno a e-mail moderátora, poznámka
Moderator\ModeratorCandidateSignedUp Web\ModeratorController, Livewire\Moderator\CandidateForm sekundární jméno kandidáta a odkaz na detail
Moderator\ModeratorCandidateUpdated ModeratorCandidateEditForm sekundární aktualizace kandidáta a komentář
Moderator\QuestionaireSended Web\ModeratorController sekundární jméno a e-mail kandidáta, odkaz na detail
QuizzEvent\EventHasBeenCanceled QuizzEventObserver provozní zrušení události a jméno toho, kdo ji zrušil
QuizzEvent\EventHasBeenChanged QuizzEventObserver provozní změna termínu události
Notifikace Spouštěč Příjemce Obsah
DatabaseNotifications\EventWithoutModeratorNotification příkaz NotifyEventsWithoutModerator uživatelé s rolí admin událost bez moderátora, metadata s ID a názvem podniku
DatabaseNotifications\HuntingPaymentNotification listener PaymentForModeration lovec podniku odměna za lov, částka, počet hráčů
DatabaseNotifications\TopicPaymentNotification TopicPaymentCalculator autor, auditor nebo korektor odměna za téma, částka, role

Kanál database mají navíc League\LeagueWinnerNotification, ChangeRequest\ChangeRequestResolved, Topic\ReturnedToAuthor, Topic\ReturnedToAudit, Topic\TopicRejected a Internal\ConfigsNotPreparedNotification.

ID Třída Stav
TOP-06 Commentable\Topic\AIAudited v kódu nikdo neodesílá, zůstává po AI auditu
TOP-07 Topic\AutoAuditFailed pouze výchozí kostra z generátoru s anglickým textem, nikdo neodesílá
HRA-01 League\LeagueWinnerNotification agenda výherců ligy je odstavená: položka leagueWinner je zakomentovaná v config/module.php, takže se do administrace nedá dostat přes menu (routy v routes/admin.php a formulář pro převzetí výhry v profilu ale existují dál). Poslední záznam v league_winners je z června 2023
MOD-06 Moderator\SpringReleaseNotification jednorázová kampaň, v kódu není volající
— Reservation\EventPutOnHold, Reservation\EventResumed zakomentované v QuizzEventObserver, třídy neexistují
Šablona Použití
resources/views/vendor/notifications/email.blade.php výchozí layout všech MailMessage notifikací; oslovení, podpis a variantu patičky dodá třída podle publika
resources/views/vendor/mail/html/* sdílená kostra, hlavička, patička ve třech variantách a komponenty, viz komponenty e-mailů
resources/views/mail/employee/get-started.blade.php vlastní markdown vstupního e-mailu moderátora, ve sdílené šabloně s interní patičkou

Adresář resources/views/emails/ neexistuje, všechny starší blade e-maily byly nahrazeny builderem.