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.
Jak notifikace vznikají
Section titled “Jak notifikace vznikají”- Kanály určuje metoda
via(). Používámemail,slackadatabase. - 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á jenModerator\CandidateWelcome([email protected]). - Příjemce se odvozuje buď z notifiable modelu (
User,TeamReservation,AlternateReservation,ModeratorCandidate,ChangeRequest), nebo z adresy předané přesNotification::route('mail', ...).
Identifikátory a kontrolní odeslání
Section titled “Identifikátory a kontrolní odeslání”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-Idje ve všech odeslaných zprávách včetně produkčních, přidává ji listenerStampMailIdentifierna událostiMessageSending; - 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.
Příkaz mail:preview
Section titled “Příkaz mail:preview”# všechny e-maily na jednu adresu
# jen inventář, nic se neodesíláphp artisan mail:preview --list
# jedna skupina nebo konkrétní zprávy
# včetně tříd, které v aplikaci nikdo neodesílá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áčů |
E-shop
Section titled “E-shop”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 |
E-maily pro moderátory a kandidáty
Section titled “E-maily pro moderátory a kandidáty”| 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 |
E-maily kolem témat a auditu
Section titled “E-maily kolem témat a auditu”| 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 |
Provozní a administrativní e-maily
Section titled “Provozní a administrativní e-maily”| 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 |
Slack notifikace
Section titled “Slack notifikace”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 v aplikaci (kanál database)
Section titled “Notifikace v aplikaci (kanál database)”| 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.
Nepoužívané a zakomentované
Section titled “Nepoužívané a zakomentované”| 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í |
Šablony
Section titled “Šablony”| Š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.
