Powiadomienia (Notification)¶
Ostatnia aktualizacja dokumentacji: 26 lutego 2026 Stan synchronizacji z kodem: Zsynchronizowany
1. Opis ogolny¶
Domena Powiadomien odpowiada za automatyczne informowanie uzytkownikow o zdarzeniach w systemie. To jak sekretarka, ktora wysyla wszystkie potwierdzenia — od utworzenia rezerwacji, przez platnosc, az po prosbe o opinie.
System obsluguje 39 typow powiadomien rozproszonych po 11 domenach biznesowych, z centralnym mechanizmem wysylania opartym na kolejkach. Kazde powiadomienie wysylane jest asynchronicznie i zapisywane w bazie danych.
Kanaly komunikacji:
- Email — sformatowane wiadomosci HTML z przyciskiem akcji
- Baza danych — zapis do odczytu w panelu administratora
2. Architektura domeny¶
2.1 Modele danych¶
Notification¶
Model glowny rozszerzajacy DatabaseNotification. Wykorzystuje UUID jako klucz glowny.
| Pole | Typ | Opis |
|---|---|---|
id | UUID | Klucz glowny |
type | string | Pelna nazwa klasy powiadomienia |
notifiable_type | string (nullable) | Typ polimorficzny encji (np. User) |
notifiable_id | UUID (nullable) | ID encji polimorficznej |
data | JSON | Dane powiadomienia (subject, content) |
event_created_at | datetime (nullable) | Czas utworzenia zdarzenia |
event_send_at | datetime (nullable) | Czas wyslania zdarzenia |
event | text (nullable) | Serializacja zdarzenia |
read_at | timestamp (nullable) | Czas oznaczenia jako przeczytane |
created_at | timestamp | Czas utworzenia |
updated_at | timestamp | Czas aktualizacji |
Cechy modelu:
- Uzywa traitu
HasUuids— automatyczne generowanie UUID - Obserwowany przez
NotificationObserver(obecnie pusty — placeholder) - Relacja polimorficzna
notifiable()(MorphTo) — moze wskazywac na dowolny model - Casty dat: format
Y-m-d H:i:s - Activity log wylaczony (
dontSubmitEmptyLogs)
DatabaseNotification (klasa bazowa)¶
Rozszerza CustomModel, dostarcza metody zarzadzania stanem odczytu:
| Metoda | Typ | Opis |
|---|---|---|
markAsRead() | void | Ustawia read_at na biezacy czas |
markAsUnread() | void | Czysci read_at (ustawia null) |
read() | bool | Sprawdza czy powiadomienie jest przeczytane |
unread() | bool | Sprawdza czy powiadomienie jest nieprzeczytane |
scopeRead() | Builder | Filtruje przeczytane powiadomienia |
scopeUnread() | Builder | Filtruje nieprzeczytane powiadomienia |
2.2 Diagram relacji¶
classDiagram
class Notification {
+UUID id
+string type
+string notifiable_type
+UUID notifiable_id
+JSON data
+timestamp read_at
+markAsRead()
+markAsUnread()
+read() bool
+unread() bool
}
class CustomNotification {
+string subject
+string content
+array action
+via() array
+toMail() MailMessage
+toArray() array
}
class SendNotification {
+__invoke(user, channel, mail, class, params)
}
class SimpleSendNotification {
+__invoke(channel, mails, class, params)
}
class SendNotificationJob {
+handle()
}
Notification --|> DatabaseNotification : extends
CustomNotification --|> LaravelNotification : extends
SendNotification --> Notification : creates record
SimpleSendNotification --> SendNotificationJob : dispatches
SendNotificationJob --> SendNotification : calls 2.3 Struktura tabel w bazie danych¶
Tabela: notifications
Migracja: 0001_01_01_000009_create_notifications.php
| Kolumna | Typ | Nullable | Default | Opis |
|---|---|---|---|---|
id | uuid | Nie | auto | Klucz glowny UUID |
type | string | Nie | — | Pelna klasa powiadomienia |
notifiable_type | string | Tak | null | Typ polimorficzny |
notifiable_id | uuid | Tak | null | ID polimorficzne |
data | text (JSON) | Nie | — | Payload: subject + content |
event_created_at | datetime | Tak | null | Czas zdarzenia |
event_send_at | datetime | Tak | null | Czas wyslania |
event | text | Tak | null | Serializacja eventu |
read_at | timestamp | Tak | null | Czas odczytu |
created_at | timestamp | Nie | auto | Czas utworzenia |
updated_at | timestamp | Nie | auto | Czas aktualizacji |
3. Endpointy API¶
Wszystkie endpointy wymagaja uwierzytelnienia (auth:api) i jednej z rol: ADMIN, SUPERVISOR, EMPLOYEE.
3.1 Lista powiadomien¶
GET /api/notifications¶
- Opis: Pobiera liste powiadomien z filtrowaniem i paginacja
- Autoryzacja: ADMIN widzi wszystkie powiadomienia; SUPERVISOR/EMPLOYEE widza tylko swoje (filtrowane po
notifiable_type = Userinotifiable_id = auth_id) - Controller:
NotificationController@index→IndexNotificationController - Request:
IndexNotificationControllerRequest
Query Parameters:
| Parametr | Typ | Opis |
|---|---|---|
filter[notifiable_type] | string | Filtr dokladny — typ encji |
filter[notifiable_id] | string | Filtr dokladny — ID encji |
filter[data->subject] | string | Filtr czesciowy — temat powiadomienia |
filter[data->content] | string | Filtr czesciowy — tresc powiadomienia |
filter[notifiable.email] | string | Filtr czesciowy — email odbiorcy |
page | integer | Numer strony |
per_page | integer | Liczba elementow na stronie |
Walidacja (FormRequest):
Reguly paginacji dziedziczone z paginationDefaultRequestRules() (TraitSupport).
Response (sukces — 200):
{
"data": [
{
"id": "uuid-string",
"type": "ReservationCreatedNotification",
"notifiable_type": "User",
"notifiable_id": "uuid-string",
"data": {
"subject": "Potwierdzenie rezerwacji nr ABC123",
"content": "<p>Dziekujemy za dokonanie rezerwacji...</p>"
},
"can_be_edit": true,
"read_at": "2026-02-26 10:30:00",
"created_at": "2026-02-26 10:00:00",
"updated_at": "2026-02-26 10:30:00"
}
],
"meta": { "current_page": 1, "per_page": 15, "total": 42 }
}
Relacje ladowane: notifiable
3.2 Oznacz wszystkie jako przeczytane¶
PATCH /api/read-notifications¶
- Opis: Oznacza wszystkie nieprzeczytane powiadomienia zalogowanego uzytkownika jako przeczytane
- Autoryzacja: ADMIN, SUPERVISOR, EMPLOYEE
- Controller:
NotificationController@read→ReadNotificationController - Body: Brak
Response (sukces — 200):
3.3 Oznacz pojedyncze jako przeczytane¶
PATCH /api/notifications/{notificationId}/set-read¶
- Opis: Oznacza konkretne powiadomienie jako przeczytane
- Autoryzacja: ADMIN, SUPERVISOR, EMPLOYEE
- Controller:
NotificationController@setRead→ReadNotificationController - Parametry URL:
notificationId(UUID)
Response (sukces — 200):
4. Logika biznesowa¶
4.1 Glowne procesy¶
Proces wysylania powiadomienia¶
sequenceDiagram
participant D as Domena (Akcja/Observer)
participant T as TraitSupport
participant J as SendNotificationJob
participant Q as Kolejka (notifications)
participant S as SendNotification
participant N as CustomNotification
participant M as Mail
participant DB as Baza danych
D->>T: sendNotification(user, channel, mail, class, params)
T->>J: dispatch(...).onQueue('notifications')
J-->>Q: Zadanie w kolejce
Q->>S: __invoke(user, channel, mail, class, params)
S->>S: shouldSkipReservationNotification?
alt Pomijanie wlaczone
S-->>S: return (nie wysyla)
end
S->>N: new NotificationClass(...params)
alt Uzytkownik istnieje
S->>N: user->notify(notification)
N->>M: toMail() — email HTML
N->>DB: toArray() — zapis do tabeli notifications
else Brak uzytkownika (np. klient bez konta)
S->>N: Notification::route(channel, mail)->notify()
S->>S: getNotifiableFromParamsNotification()
S->>DB: Notification::create() — reczny zapis
end Proces masowego wysylania (SimpleSendNotification)¶
Uzywany np. przy aktualizacji dokumentow prawnych (wysylka do wszystkich klientow):
sequenceDiagram
participant A as Akcja domenowa
participant SS as SimpleSendNotification
participant J as SendNotificationJob
participant Q as Kolejka
A->>SS: __invoke(channel, [emails], class, params)
loop Dla kazdego emaila
SS->>J: dispatch(user, channel, email, class, params)
J-->>Q: Zadanie w kolejce
end 4.2 Reguly biznesowe¶
- Asynchronicznosc — wszystkie powiadomienia wysylane sa przez kolejke
notifications, nie blokuja uzytkownika - Pomijanie powiadomien — rezerwacje z flaga
send_notifications = falsepomijaja wysylke powiadomien rezerwacyjnych i reklamacyjnych - Kontrola dostepu — administratorzy widza wszystkie powiadomienia; pozostale role widza tylko swoje
- Kanaly — domyslnie
['mail', 'database']; niektore powiadomienia nadpisuja na['mail'](np.PinApprovedNotification) - Automatyczne czyszczenie — powiadomienia starsze niz
REMOVE_NOTIFICATIONS_OLDER_THAN_DAYSdni sa usuwane przez komende CRON - Polimorfizm — powiadomienia moga byc przypisane do dowolnego modelu przez
notifiable_type/notifiable_id - Zapis dla klientow bez konta — jesli odbiorca nie ma konta User, system recznie tworzy rekord w tabeli
notificationsz odpowiednimnotifiable_typeinotifiable_id
4.3 Mechanizm pomijania powiadomien (Skip Logic)¶
Klasa ShouldSkipReservationNotification sprawdza:
- Dla powiadomien z
Domain\Reservation\Notification\— czy rezerwacja masend_notifications = false - Dla powiadomien z
Domain\Complaint\Notification\— czy powiazana rezerwacja masend_notifications = false
Jesli warunek spelniony — powiadomienie nie jest wysylane.
4.4 Walidacje¶
IndexNotificationControllerRequest¶
| Pole | Reguly |
|---|---|
| Paginacja | paginationDefaultRequestRules() — standardowe reguly paginacji z TraitSupport |
Autoryzacja: authorize() zwraca true — kontrola dostepu realizowana na poziomie middleware (role) i w akcji kontrolera (filtrowanie per uzytkownik).
5. Autoryzacja i uprawnienia¶
| Akcja | ADMIN | SUPERVISOR | EMPLOYEE | Klient |
|---|---|---|---|---|
| Lista powiadomien (wszystkie) | ||||
| Lista powiadomien (swoje) | ||||
| Oznacz jako przeczytane | ||||
| Oznacz pojedyncze jako przeczytane |
Klienci a powiadomienia
Klienci otrzymuja powiadomienia email, ale nie maja dostepu do API powiadomien w panelu. Powiadomienia dla klientow sa zapisywane w bazie z notifiable_type wskazujacym na model domenowy (np. Reservation, Complaint).
6. Typy powiadomien¶
System zawiera 39 typow powiadomien rozproszonych po 11 domenach:
6.1 Rezerwacje (18 powiadomien)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
ReservationCreatedNotification | Po zlozeniu rezerwacji | Klient | mail, database |
ReservationEmailConfirmationNotification | Weryfikacja adresu email | Klient | mail, database |
ReservationPaymentPendingNotification | Po potwierdzeniu email — oczekiwanie na platnosc | Klient | mail, database |
ReservationPaymentConfirmedNotification | Po oplaceniu rezerwacji | Klient | mail, database |
ReservationPaymentFailedNotification | Po nieudanej platnosci P24 | Klient | mail, database |
ReservationPaymentReminderNotification | Przypomnienie przed terminem platnosci | Klient | mail, database |
ReservationPriceConfirmedNotification | Po zatwierdzeniu ceny | Klient | mail, database |
ReservationCancelledNotification | Po anulowaniu rezerwacji | Klient | mail, database |
ReservationCancelledDueToItemBlockNotification | Obiekt zablokowany — automatyczne anulowanie | Klient | mail, database |
ReservationCancelledDueToActivityCancellationNotification | Anulowanie zajec — automatyczne anulowanie | Klient | mail, database |
ReservationRefundProcessedNotification | Po przetworzeniu zwrotu | Klient | mail, database |
RefundConfirmationNotification | Potwierdzenie zwrotu z PDF | Klient | mail, database |
ReservationReceiptNotification | Rachunek za platnosc z PDF | Klient | mail, database |
ReservationReminderNotification | Dzien przed terminem rezerwacji | Klient | mail, database |
ReservationReviewReminderNotification | Po zakonczeniu rezerwacji — prosba o opinie | Klient | mail, database |
NewReservationForItemManagerNotification | Nowa rezerwacja obiektu | Manager obiektu | mail, database |
NewParticipantForTrainerNotification | Nowy uczestnik zajec | Trener | mail, database |
SlotCancelledForManagerNotification | Anulowanie slotu — alert dla managera | Manager obiektu | mail, database |
Zalaczniki PDF
ReservationReceiptNotification generuje rachunek PDF przez ReceiptGenerator. RefundConfirmationNotification generuje potwierdzenie zwrotu PDF przez RefundConfirmationGenerator.
6.2 Uzytkownicy (5 powiadomien)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
UserWelcomeNotification | Utworzenie konta pracownika | Nowy uzytkownik | mail, database |
UserOneTimePasswordNotification | Logowanie z kodem OTP | Uzytkownik | mail, database |
UserResetPasswordNotification | Prosba o reset hasla | Uzytkownik | mail, database |
UserSecurityAlertNotification | Wykrycie zagrozenia (ponowne uzycie tokena, niezgodnosc fingerprintu) | Uzytkownik | mail, database |
UserNewLoginNotification | Logowanie z nowego urzadzenia (IP, przegladarka, czas) | Uzytkownik | mail, database |
6.3 Reklamacje (4 powiadomienia)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
ComplaintCreatedNotification | Po zlozeniu reklamacji | Klient + Supervisor | mail, database |
ComplaintUpdatedNotification | Po zmianie statusu reklamacji | Klient | mail, database |
ComplaintMessageCreatedNotification | Nowa wiadomosc w watku | Klient lub Supervisor | mail, database |
ComplaintNewSupervisorNotification | Przypisanie nowego opiekuna | Supervisor | mail, database |
6.4 Dostep PIN (3 powiadomienia)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
PinRequestSubmittedNotification | Po zlozeniu wniosku o PIN | Wnioskodawca | mail, database |
PinApprovedNotification | Po zatwierdzeniu — z kodem PIN | Wnioskodawca | mail (bez database) |
PinRejectedNotification | Po odrzuceniu wniosku | Wnioskodawca | mail, database |
Wyjatkowy kanal
PinApprovedNotification nadpisuje via() na ['mail'] — PIN nie jest zapisywany w bazie danych powiadomien ze wzgledow bezpieczenstwa.
6.5 Organizacje (2 powiadomienia)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
OrganizationEmployeeCreatedNotification | Przypisanie pracownika do organizacji | Pracownik | mail, database |
OrganizationEmployeeDeletedNotification | Usuniecie pracownika z organizacji | Pracownik | mail, database |
6.6 Obiekty (2 powiadomienia)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
ItemManagerCreatedNotification | Przypisanie managera obiektu | Manager | mail, database |
ItemManagerDeletedNotification | Usuniecie managera obiektu | Manager | mail, database |
6.7 Raporty (1 powiadomienie)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
ReportGeneratedNotification | Zakonczenie generowania raportu | Zlecajacy | mail, database |
Zalacznik CSV
ReportGeneratedNotification dolacza plik CSV z wynikami raportu do wiadomosci email.
6.8 Dokumenty prawne (1 powiadomienie)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
LegalDocumentUpdatedNotification | Aktualizacja regulaminu/polityki | Wszyscy klienci | mail, database |
6.9 Tryb aplikacji (1 powiadomienie)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
ChangeAppModeNotification | Przelaczenie trybu dev/prod | Administrator | mail, database |
6.10 Zadania kolejek (1 powiadomienie)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
JobErrorNotification | Niepowodzenie zadania w tle | Administrator | mail, database |
6.11 Komendy CRON (1 powiadomienie)¶
| Klasa | Kiedy wysylane | Odbiorca | Kanaly |
|---|---|---|---|
CommandErrorNotification | Niepowodzenie komendy CRON | Administrator | mail, database |
7. Jak to dziala?¶
Scenariusz 1: Powiadomienia przy rezerwacji¶
sequenceDiagram
participant K as Klient
participant S as System
participant Q as Kolejka
participant E as Email
K->>S: Tworzy rezerwacje
S->>Q: Kolejkuje powiadomienie
Q->>E: Wysyla email
E-->>K: "Potwierdzenie rezerwacji"
K->>S: Potwierdza email
S->>Q: Kolejkuje powiadomienie
Q->>E: Wysyla email
E-->>K: "Link do platnosci"
K->>S: Oplaca rezerwacje
S->>Q: Kolejkuje powiadomienie
Q->>E: Wysyla email
E-->>K: "Platnosc potwierdzona + rachunek PDF"
Note over K,E: Alternatywnie — blad platnosci
K->>S: Platnosc nieudana (P24 callback)
S->>Q: Kolejkuje powiadomienie
Q->>E: Wysyla email
E-->>K: "Platnosc nieudana — sprobuj ponownie" Scenariusz 2: Przegladanie powiadomien w panelu¶
- Administrator loguje sie do panelu
- Widzi liste powiadomien z filtrami (temat, tresc, odbiorca)
- Moze oznaczyc pojedyncze jako przeczytane (
PATCH /notifications/{id}/set-read) - Moze oznaczyc wszystkie jako przeczytane (
PATCH /read-notifications) - Stare powiadomienia sa automatycznie usuwane przez komende CRON
Scenariusz 3: Powiadomienie z pomijaniem¶
flowchart TD
A[Zdarzenie w domenie] --> B{Typ powiadomienia?}
B -->|Rezerwacja| C{reservation.send_notifications?}
B -->|Reklamacja| D{Powiazana rezerwacja.send_notifications?}
B -->|Inne| E[Wyslij powiadomienie]
C -->|true| E
C -->|false| F[Pomin powiadomienie]
D -->|true| E
D -->|false| F 8. Infrastruktura techniczna¶
8.1 Klasa bazowa CustomNotification¶
Wszystkie 39 klas powiadomien rozszerzaja Infrastructure\Vendor\CustomNotification:
CustomNotification extends Notification
├── Queueable — wsparcie kolejek
├── TraitSupport — metody pomocnicze
├── Properties: subject, content, action
├── via() → ['mail', 'database']
├── toMail() → SimpleBuildMailMessage
└── toArray() → {subject, content}
Wzorzec konstruktora:
Kazda klasa powiadomienia w konstruktorze:
- Przyjmuje model(e) domenowe jako parametry
- Buduje
subject(temat emaila) - Buduje
content(tresc HTML) - Ustawia
action(przycisk CTA z URL) - Opcjonalnie nadpisuje
via()lubtoMail()
8.2 Budowanie wiadomosci email¶
SimpleBuildMailMessage tworzy MailMessage:
- Laduje konfiguracje gminy (
loadMunicipalityConfiguration()) - Ustawia powitanie: "Szanowni Panstwo,"
- Tresc jako
HtmlString(formatowany HTML) - Przycisk akcji z tekstem i URL
- Podpis: "Z powazaniem," + nazwa gminy
8.3 Kolejkowanie¶
| Komponent | Kolejka | Opis |
|---|---|---|
SendNotificationJob | notifications | Wysylka pojedynczego powiadomienia |
SimpleSendNotificationJob | notifications | Obsluga batch dispatch |
ReportGeneratedNotification | notifications | Explicit onQueue('notifications') |
Worker: php artisan queue:work --queue=notifications
8.4 Mechanizm wysylki¶
Dwie sciezki wysylki powiadomien:
| Sciezka | Klasa | Uzycie |
|---|---|---|
| Indywidualna | SendNotification | Jeden odbiorca — uzytkownik lub email |
| Masowa | SimpleSendNotification | Lista emailow — np. aktualizacja dokumentow prawnych |
8.5 Zrodla wyzwalania powiadomien¶
| Zrodlo | Przyklad |
|---|---|
| Observery modeli | OrganizationEmployeeObserver, ItemManagerObserver, CreatedComplaintObserver |
| Akcje domenowe | SendReservationConfirmationEmail, SendPaymentConfirmedNotification, SendCancellationNotification |
| Komendy CRON | SendReservationRemindersCommandAction, SendPaymentRemindersCommandAction, SendReviewRemindersCommandAction |
| Middleware infrastrukturalne | MonitoringCommandMiddleware (bledy komend), ChangeAppModeCommandAction (zmiana trybu) |
9. Powiazania z innymi domenami¶
graph LR
N[Notification]
R[Reservation] -->|18 powiadomien| N
U[User] -->|5 powiadomien| N
C[Complaint] -->|4 powiadomienia| N
A[Access] -->|3 powiadomienia| N
O[Organization] -->|2 powiadomienia| N
I[Item] -->|2 powiadomienia| N
RP[Report] -->|1 powiadomienie| N
LD[LegalDocument] -->|1 powiadomienie| N
AM[AppMode] -->|1 powiadomienie| N
J[Job] -->|1 powiadomienie| N
CMD[Command] -->|1 powiadomienie| N
CFG[Configuration] -.->|REMOVE_NOTIFICATIONS_OLDER_THAN_DAYS| N | Domena | Liczba powiadomien | Kierunek |
|---|---|---|
| Rezerwacje | 18 | Rezerwacja → Notification |
| Uzytkownicy | 5 | User → Notification |
| Reklamacje | 4 | Complaint → Notification |
| Dostep | 3 | Access → Notification |
| Organizacje | 2 | Organization → Notification |
| Zasoby | 2 | Item → Notification |
| Raporty | 1 | Report → Notification |
| Dokumenty prawne | 1 | LegalDocument → Notification |
| Tryb aplikacji | 1 | AppMode → Notification |
| Zadania kolejek | 1 | Job → Notification |
| Komendy CRON | 1 | Command → Notification |
| Konfiguracja | — | Dostarcza parametr czyszczenia |
10. Konfiguracja¶
Parametry systemowe¶
| Parametr | Typ | Opis |
|---|---|---|
REMOVE_NOTIFICATIONS_OLDER_THAN_DAYS | integer | Liczba dni po ktorych powiadomienia sa automatycznie usuwane |
Komenda CRON¶
Usuwanie realizowane bezposrednio zapytaniem SQL na tabeli notifications — wydajna operacja masowa.
Zmienne srodowiskowe¶
| Zmienna | Uzycie |
|---|---|
FRONTEND_URL | Budowanie URL-i w przyciskach akcji (CTA) powiadomien |
MAIL_* | Konfiguracja SMTP dla wysylki email |
11. Struktura plikow domeny¶
app/Domain/Notification/
├── Action/
│ ├── Controller/
│ │ ├── IndexNotificationController.php # Lista powiadomien z filtrowaniem
│ │ └── ReadNotificationController.php # Oznaczanie jako przeczytane
│ └── Other/
│ └── RemoveOldNotificationsCommandAction.php # Usuwanie starych powiadomien
├── Command/
│ └── RemoveOldNotificationsCommand.php # Komenda artisan CRON
├── Controller/
│ └── NotificationController.php # Kontroler z middleware rol
├── Model/
│ ├── DatabaseNotification.php # Bazowy model z metodami read/unread
│ └── Notification.php # Glowny model z UUID i observerem
├── Observer/
│ └── NotificationObserver.php # Observer (obecnie pusty)
├── Request/
│ └── IndexNotificationControllerRequest.php # Walidacja paginacji
├── Resource/
│ └── NotificationResource.php # Transformacja JSON
└── Service/
├── NotificationEnumService.php # Enum konfiguracyjny
├── TraitControllerNotification.php # Trait kontrolera
└── TraitNotification.php # Trait domeny
Pliki infrastruktury i supportu:
| Plik | Opis |
|---|---|
Infrastructure/Vendor/CustomNotification.php | Klasa bazowa wszystkich powiadomien |
Infrastructure/Vendor/HasDatabaseNotifications.php | Trait relacji dla modeli |
Support/Action/Notification/SendNotification.php | Wysylka indywidualna |
Support/Action/Notification/SimpleSendNotification.php | Wysylka masowa |
Support/Action/Notification/SimpleBuildMailMessage.php | Budowanie wiadomosci email |
Support/Job/SendNotificationJob.php | Job kolejki — wysylka indywidualna |
Support/Job/SimpleSendNotificationJob.php | Job kolejki — batch dispatch |
Support/Action/Other/ShouldSkipReservationNotification.php | Logika pomijania powiadomien |
12. Struktura powiadomienia¶
Kazde powiadomienie zawiera:
| Element | Opis | Przyklad |
|---|---|---|
| Temat | Krotki tytul wiadomosci | "Potwierdzenie rezerwacji nr ABC123" |
| Tresc | Sformatowany HTML z informacjami | Lista szczegolow rezerwacji |
| Przycisk akcji | CTA z linkiem do frontendu | "Zobacz rezerwacje" → /rezerwacje/{id} |
| Powitanie | Stale | "Szanowni Panstwo," |
| Podpis | Nazwa gminy z konfiguracji | "Z powazaniem, Gmina Przykladowa" |
Przykladowe powiadomienie
Temat: Potwierdzenie rezerwacji nr ABC123
Tresc: Dziekujemy za dokonanie rezerwacji w systemie.
Szczegoly rezerwacji:
- Numer rezerwacji: ABC123
- Kod dostepu: XYZ789
- Data rozpoczecia: 2026-03-15 10:00
- Data zakonczenia: 2026-03-15 12:00
- Status: Oczekujaca
- Cena calkowita: 50,00 PLN
Przycisk: [Zobacz rezerwacje]
13. Wartosc biznesowa¶
Argumenty dla decydentow
- Zero recznej pracy — wszystkie powiadomienia wysylane automatycznie
- Profesjonalny wizerunek — spojna, markowa komunikacja z nazwa gminy
- Zadowolenie klientow — klient zawsze wie co sie dzieje z rezerwacja
- Redukcja telefonow — mniej pytan "co z moja rezerwacja?"
- Bezpieczenstwo — alerty o nowych logowaniach i zagrozeniach
- Elastycznosc — mozliwosc wylaczenia powiadomien per rezerwacja
- Skalowalnosc — asynchroniczna wysylka przez kolejki nie obciaza systemu
14. Znane ograniczenia i TODO¶
NotificationObserverjest obecnie pusty — placeholder na przyszle hooki lifecycle- Brak kanalu push/SMS — obecnie tylko email i baza danych
- Brak mozliwosci konfigurowania przez uzytkownika, ktore typy powiadomien chce otrzymywac
- Klienci nie maja dostepu do API powiadomien — moga je tylko otrzymywac emailem