{"id":23452332,"url":"https://github.com/majkeloess/przyjemnosc","last_synced_at":"2026-04-11T14:01:48.088Z","repository":{"id":263652765,"uuid":"891038615","full_name":"majkeloess/przyjemnosc","owner":"majkeloess","description":"System zarządzania rezerwacjami w restauracji ","archived":false,"fork":false,"pushed_at":"2025-01-22T18:14:47.000Z","size":7899,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-10T19:46:45.026Z","etag":null,"topics":["bcrypt","bcryptjs","jwt","nextjs","nextjs15","nodejs","postgresql","react","restaurant","restaurant-management","typescript","vercel","webapp","webapplication"],"latest_commit_sha":null,"homepage":"https://przyjemnosc.majkeloess.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/majkeloess.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-11-19T16:08:52.000Z","updated_at":"2025-01-22T18:14:51.000Z","dependencies_parsed_at":"2024-11-19T18:30:09.428Z","dependency_job_id":"e5681062-fd23-419b-99f8-8e8c27c0126e","html_url":"https://github.com/majkeloess/przyjemnosc","commit_stats":null,"previous_names":["majkeloess/przyjemnosc"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/majkeloess/przyjemnosc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/majkeloess%2Fprzyjemnosc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/majkeloess%2Fprzyjemnosc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/majkeloess%2Fprzyjemnosc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/majkeloess%2Fprzyjemnosc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/majkeloess","download_url":"https://codeload.github.com/majkeloess/przyjemnosc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/majkeloess%2Fprzyjemnosc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31682953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T13:07:20.380Z","status":"ssl_error","status_checked_at":"2026-04-11T13:06:47.903Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bcrypt","bcryptjs","jwt","nextjs","nextjs15","nodejs","postgresql","react","restaurant","restaurant-management","typescript","vercel","webapp","webapplication"],"created_at":"2024-12-24T01:14:53.894Z","updated_at":"2026-04-11T14:01:48.050Z","avatar_url":"https://github.com/majkeloess.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Projekt bez nazwy](https://github.com/user-attachments/assets/cac18e88-b0c7-4b77-8f57-b0514f122914)\n# System zarządzania rezerwacjami dla restauracji \"Przyjemność\"\n\nProjekt został zrealizowany w celu zaliczenia przedmiotu Bazy Danych 1 WFIIS AGH 24/25.\n\n## Projekt koncepcji i założenia\n\n### Cele projektu\n\nProjekt stanowi kompleksowe rozwiązanie do zarządzania rezerwacjami stolików w restauracji. System został zaprojektowany jako aplikacja fullstackowa wykorzystująca technologie Next.js oraz bazę danych PostgreSQL. Głównym celem jest automatyzacja procesu rezerwacji oraz efektywne zarządzanie stolikami w restauracji. Aplikacja jest w pełni responsywna na komputerach jak i na urządzeniach mobilnych.\n\n#### Główne cele projektu:\n\n- Usprawnienie procesu rezerwacji stolików\n- Zwiększenie efektywności zarządzania miejscami w restauracji\n- Implementacja systemu lojalnościowego dla stałych klientów\n- Zapewnienie narzędzi analitycznych dla kierownictwa restauracji\n- Minimalizacja ryzyka podwójnych rezerwacji\n\n### Analiza wymagań użytkownika\n\n#### Wymagania funkcjonalne dla klientów:\n\n- Możliwość utworzenia i zarządzania kontem użytkownika\n- Dokonywanie rezerwacji stolików online\n- Przeglądanie dostępnych terminów i stolików\n- Dostęp do historii własnych rezerwacji\n- Korzystanie z kodów lojalnościowych\n- Możliwość anulowania rezerwacji\n\n#### Wymagania funkcjonalne dla administratorów:\n\n- Zarządzanie rezerwacjami (podgląd, edycja, anulowanie)\n- Zarządzanie stolikami (dodawanie, edycja, usuwanie)\n- Dostęp do raportów i statystyk\n- Zarządzanie menu restauracji\n- Monitoring systemu lojalnościowego\n- Zarządzanie kontami użytkowników\n\n### Podstawowe funkcje systemu\n\n#### Funkcje związane z rezerwacjami:\n\n- Automatyczna walidacja dostępności stolików\n- Automatyczna aktualizacja statusów rezerwacji\n- Kontrola nakładania się rezerwacji\n- Generowanie potwierdzeń rezerwacji\n\n#### Funkcje systemu lojalnościowego:\n\n- Automatyczne generowanie kodów lojalnościowych\n- Walidacja kodów rabatowych\n- Śledzenie historii wykorzystania kodów\n- Przyznawanie kodów po określonej liczbie wizyt\n\n#### Funkcje raportowania:\n\n- Generowanie raportów dziennych rezerwacji\n- Analiza popularności stolików\n- Statystyki lojalności klientów\n- Raporty miesięczne wykorzystania restauracji\n\n#### Funkcje administracyjne:\n\n- Zarządzanie użytkownikami i uprawnieniami\n- Konfiguracja parametrów systemu\n- Zarządzanie menu restauracji\n- Monitoring aktywności systemu\n\n#### Funkcje bezpieczeństwa:\n\n- Szyfrowanie danych użytkowników\n- Walidacja danych wejściowych\n- Kontrola dostępu do funkcji systemu\n- Zabezpieczenie przed nieautoryzowanym dostępem\n\nSystem został zaprojektowany z myślą o skalowalności i możliwości rozbudowy o dodatkowe funkcjonalności w przyszłości, zachowując przy tym wysoką wydajność i niezawodność działania.\n\n## Projekt diagramów\n\n### Diagram przepływu danych (DFD)\n\n#### Poziom 0 (Diagram kontekstowy):\n\n```mermaid\ngraph TD\n    Klient[Klient] --\u003e|Rejestracja/Logowanie| System[System Rezerwacji]\n    Klient --\u003e|Dokonanie rezerwacji| System\n    System --\u003e|Potwierdzenie rezerwacji| Klient\n    System --\u003e|Kody lojalnościowe| Klient\n    Administrator[Administrator] --\u003e|Zarządzanie systemem| System\n    System --\u003e|Raporty i statystyki| Administrator\n    System --\u003e|Status rezerwacji| Klient\n```\n\n#### Poziom 1:\n\n```mermaid\ngraph TD\n    %% Procesy główne\n    P1[1.0 Zarządzanie użytkownikami]\n    P2[2.0 Zarządzanie rezerwacjami]\n    P3[3.0 System lojalnościowy]\n    P4[4.0 Raportowanie]\n\n    %% Magazyny danych\n    D1[(Baza użytkowników)]\n    D2[(Baza rezerwacji)]\n    D3[(Baza kodów)]\n    D4[(Baza stolików)]\n\n    %% Przepływy danych - Użytkownicy\n    Klient --\u003e|Dane rejestracji| P1\n    P1 --\u003e|Zapisz dane| D1\n    P1 --\u003e|Autoryzacja| Klient\n\n    %% Przepływy danych - Rezerwacje\n    Klient --\u003e|Nowa rezerwacja| P2\n    P2 --\u003e|Sprawdź dostępność| D4\n    P2 --\u003e|Zapisz rezerwację| D2\n    P2 --\u003e|Potwierdzenie| Klient\n\n    %% Przepływy danych - System lojalnościowy\n    P2 --\u003e|Zakończona rezerwacja| P3\n    P3 --\u003e|Generuj kod| D3\n    P3 --\u003e|Wyślij kod| Klient\n\n    %% Przepływy danych - Raportowanie\n    Administrator --\u003e|Żądanie raportu| P4\n    P4 --\u003e|Pobierz dane| D2\n    P4 --\u003e|Statystyki| Administrator\n```\n\n### Encje i atrybuty\n\n1. **Użytkownik (users)**\n\n   - id (UUID)\n   - username (VARCHAR)\n   - email (VARCHAR)\n   - password_hash (TEXT)\n   - type (ENUM)\n   - created_at (TIMESTAMP)\n\n2. **Stolik (tables)**\n\n   - id (SERIAL)\n   - table_number (INTEGER)\n   - capacity (INTEGER)\n   - created_at (TIMESTAMP)\n\n3. **Rezerwacja (reservations)**\n\n   - id (SERIAL)\n   - user_id (UUID)\n   - start_time (TIMESTAMP)\n   - end_time (TIMESTAMP)\n   - status (ENUM)\n   - notes (TEXT)\n   - source (ENUM)\n   - created_at (TIMESTAMP)\n\n4. **Kod lojalnościowy (loyaltycodes)**\n\n   - id (SERIAL)\n   - user_id (UUID)\n   - code (VARCHAR)\n   - discount_percentage (INTEGER)\n   - used (BOOLEAN)\n   - created_at (TIMESTAMP)\n\n5. **Pozycja menu (menuitems)**\n   - id (SERIAL)\n   - name (VARCHAR)\n   - description (TEXT)\n   - price (INTEGER)\n   - type (ENUM)\n   - created_at (TIMESTAMP)\n\n### 6. Relacje między encjami\n\n\u003cimg width=\"1280\" alt=\"image\" src=\"https://github.com/user-attachments/assets/2aaf6efe-57f4-43e6-b610-1f427bf820a8\" /\u003e\n\n\n#### Opis relacji:\n\n1. **Użytkownik - Rezerwacja**\n\n   - Relacja jeden-do-wielu\n   - Użytkownik może mieć wiele rezerwacji\n   - Każda rezerwacja należy do jednego użytkownika\n\n2. **Rezerwacja - Stolik**\n\n   - Relacja wiele-do-wielu\n   - Rozwiązana przez tabelę pośrednią reservationtables\n   - Jedna rezerwacja może obejmować wiele stolików\n   - Jeden stolik może być w wielu rezerwacjach\n\n3. **Użytkownik - Kod lojalnościowy**\n   - Relacja jeden-do-wielu\n   - Użytkownik może mieć wiele kodów lojalnościowych\n   - Każdy kod należy do jednego użytkownika\n\n## Projekt logiczny\n\n### Projektowanie tabel, kluczy i indeksów\n\n#### Struktura bazy danych\n\nBaza danych została zaprojektowana w schemacie \"restaurant\" i zawiera następujące tabele:\n\n1. **users** - przechowuje dane użytkowników\n\n   - Klucz główny: `id` (uuid)\n   - Unikalne constrainty: `username`, `email`\n   - Walidacja email poprzez CHECK constraint\n\n2. **tables** - przechowuje informacje o stolikach\n\n   - Klucz główny: `id` (serial)\n   - Unikalny constraint: `table_number`\n   - Walidacja pojemności (1-12 osób)\n\n3. **reservations** - przechowuje rezerwacje\n\n   - Klucz główny: `id` (serial)\n   - Powiązanie z `users` przez `user_id`\n   - Automatyczna aktualizacja statusu przez trigger\n\n4. **reservationtables** - tabela łącząca rezerwacje ze stolikami\n\n   - Klucz główny: kombinacja `(reservation_id, table_id)`\n   - Klucze obce z CASCADE DELETE\n\n5. **loyaltycodes** - kody lojalnościowe\n\n   - Klucz główny: `id` (serial)\n   - Powiązanie z `users` przez `user_id` (SET NULL przy usunięciu)\n   - Walidacja formatu kodu przez trigger\n\n6. **menuitems** - pozycje menu\n   - Klucz główny: `id` (serial)\n   - Walidacja ceny i nazwy przez trigger\n\n#### Indeksy\n\nZoptymalizowano wydajność zapytań poprzez utworzenie indeksów:\n\n```sql\nCREATE INDEX idx_reservations_status ON restaurant.reservations(status);\nCREATE INDEX idx_reservations_start_time ON restaurant.reservations(start_time);\nCREATE INDEX idx_reservations_user_id ON restaurant.reservations(user_id);\nCREATE INDEX idx_loyalty_codes_user_id ON restaurant.loyaltycodes(user_id);\n```\n\n### Słowniki danych\n\n#### Typy wyliczeniowe (ENUM)\n\n1. **user_type**\n\n   - 'admin' - administrator systemu\n   - 'customer' - klient restauracji\n\n2. **reservation_status**\n\n   - 'cancelled' - rezerwacja anulowana\n   - 'done' - rezerwacja zrealizowana\n   - 'pending' - rezerwacja oczekująca\n\n3. **menu_type**\n\n   - 'przystawki', 'salatki', 'zupy', 'miesa', 'ryby', 'regionalne', 'dodatki', 'napoje'\n\n4. **reservation_source**\n   - 'phone' - rezerwacja telefoniczna\n   - 'page' - rezerwacja online\n\n### Analiza zależności funkcyjnych i normalizacja\n\nBaza danych spełnia wymagania trzeciej postaci normalnej (3NF):\n\n1. Wszystkie tabele są w 1NF:\n\n   - Każda kolumna zawiera wartości atomowe\n   - Brak powtarzających się grup kolumn\n\n2. Spełnione są wymagania 2NF:\n\n   - Wszystkie atrybuty niekluczowe są w pełni funkcyjnie zależne od klucza głównego\n\n3. Spełnione są wymagania 3NF:\n   - Brak zależności przechodnich między atrybutami niekluczowymi\n\n### Denormalizacja\n\nW celu optymalizacji wydajności i ułatwienia raportowania, utworzono następujące widoki:\n\n1. **active_reservations** - aktywne rezerwacje z danymi użytkowników\n2. **user_statistics** - statystyki użytkowników\n3. **available_tables** - aktualnie dostępne stoliki\n4. **daily_reservations_report** - raport dzienny rezerwacji\n5. **table_popularity_report** - raport popularności stolików\n6. **customer_loyalty_report** - raport lojalności klientów\n\n### Operacje na danych\n\nZaimplementowano następujące funkcje i triggery:\n\n1. **Automatyczna aktualizacja statusu rezerwacji**\n\n   - Trigger `after_reservation_insert`\n   - Aktualizuje status rezerwacji na 'done' po 2 godzinach\n\n2. **System kodów lojalnościowych**\n\n   - Funkcja `generate_loyalty_code`\n   - Trigger `generate_loyalty_code_trigger`\n   - Automatyczne generowanie kodów po każdej 3 zrealizowanej rezerwacji\n\n3. **Walidacja dostępności stolików**\n\n   - Funkcja `check_table_availability`\n   - Trigger `check_table_availability_trigger`\n   - Zapobiega nakładaniu się rezerwacji\n\n4. **Walidacja danych**\n   - Walidacja emaili użytkowników\n   - Walidacja pojemności stolików\n   - Walidacja kodów lojalnościowych\n   - Walidacja pozycji menu\n\n#### Zaimplementowane raporty i analizy:\n\n1. **Raport dzienny rezerwacji (ostatnie 7 dni)**\n\n```sql\nSELECT\n    reservation_date,\n    total_reservations,\n    completed,\n    cancelled,\n    pending,\n    unique_customers,\n    tables_used\nFROM restaurant.daily_reservations_report\nWHERE reservation_date \u003e= CURRENT_DATE - INTERVAL '7 days'\nORDER BY reservation_date DESC;\n```\n\n2. **Raport popularności stolików**\n\n```sql\nSELECT\n    table_number,\n    capacity,\n    total_reservations,\n    successful_reservations,\n    success_rate || '%' as success_rate,\n    cancellations\nFROM restaurant.table_popularity_report\nWHERE total_reservations \u003e 0\nORDER BY success_rate DESC;\n```\n\n3. **Raport lojalności klientów (top 10)**\n\n```sql\nSELECT\n    username,\n    total_reservations,\n    completed_reservations,\n    loyalty_codes_received,\n    loyalty_codes_used,\n    ROUND((completed_reservations::DECIMAL /\n           NULLIF(total_reservations, 0) * 100), 2) || '%' as completion_rate,\n    last_reservation_date\nFROM restaurant.customer_loyalty_report\nWHERE total_reservations \u003e 0\nORDER BY completed_reservations DESC, total_reservations DESC\nLIMIT 10;\n```\n\n4. **Raport miesięczny rezerwacji**\n\n```sql\nSELECT\n    TO_CHAR(reservation_date, 'YYYY-MM') as month,\n    SUM(total_reservations) as total_reservations,\n    SUM(completed) as completed,\n    SUM(cancelled) as cancelled,\n    SUM(pending) as pending,\n    COUNT(DISTINCT tables_used) as unique_tables_used\nFROM restaurant.daily_reservations_report\nGROUP BY TO_CHAR(reservation_date, 'YYYY-MM')\nORDER BY month DESC;\n```\n\n#### Zaimplementowane procedury bezpieczeństwa:\n\n1. **Walidacja danych wejściowych**\n\n   - Sprawdzanie poprawności adresów email\n   - Weryfikacja formatów kodów lojalnościowych\n   - Kontrola pojemności stolików\n   - Walidacja cen w menu\n\n2. **Kontrola integralności danych**\n\n   - Kaskadowe usuwanie powiązanych rekordów\n   - Automatyczna aktualizacja statusów rezerwacji\n   - Zabezpieczenie przed duplikacją rezerwacji\n\n3. **Zarządzanie uprawnieniami**\n   - Rozróżnienie ról użytkowników (admin/customer)\n   - Ograniczenie dostępu do funkcji administracyjnych\n   - Kontrola dostępu do raportów i statystyk\n\n## Projekt funkcjonalny\n\n### Interfejsy do prezentacji, edycji i obsługi danych\n\n#### Formularze wprowadzania danych:\n\n1. **Formularz rejestracji użytkownika**\n\n   - Pola: username, email, hasło, potwierdzenie hasła\n   - Walidacja email i hasła\n   - Automatyczne przypisanie roli 'customer'\n\n   Zobacz implementację w [RejestracjaForm.tsx](https://github.com/majkeloess/przyjemnosc/blob/main/components/reservation-page.tsx/RejestracjaForm.tsx#L50-L74)\n\n2. **Formularz rezerwacji stolika**\n\n   - Wybór liczby osób\n   - Wybór daty i godziny\n   - Automatyczna walidacja dostępności\n   - Obsługa błędów i potwierdzeń\n\n   Zobacz implementację w [RezerwacjaForm.tsx](https://github.com/majkeloess/przyjemnosc/blob/main/components/reservation-page.tsx/RezerwacjaForm.tsx#L11-L54)\n\n3. **System powiązań formularzy:**\n   - Rezerwacja możliwa tylko dla zalogowanych użytkowników\n   - Automatyczne przypisanie użytkownika do rezerwacji\n   - Walidacja kodów lojalnościowych przed zastosowaniem\n\n### Wizualizacja danych\n\n#### Raporty systemowe:\n\n1. **Raport dzienny rezerwacji**\n\n   - Statystyki rezerwacji z ostatnich 7 dni\n   - Podsumowanie statusów rezerwacji\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L281-L292)\n\n2. **Raport popularności stolików**\n\n   - Analiza wykorzystania stolików\n   - Wskaźnik sukcesu rezerwacji\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L294-L304)\n\n3. **Raport lojalności klientów**\n\n   - Top 10 najbardziej aktywnych klientów\n   - Statystyki wykorzystania kodów lojalnościowych\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L306-L319)\n\n4. **Raport miesięczny**\n\n   - Agregacja danych miesięcznych\n   - Trendy w rezerwacjach\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L321-L331)\n\n### Panel sterowania aplikacji\n\n#### Panel klienta:\n\n- Podgląd własnych rezerwacji\n- Możliwość anulowania rezerwacji\n- Historia kodów lojalnościowych\n\nZobacz implementację w [ReservationRow.tsx](https://github.com/majkeloess/przyjemnosc/blob/main/components/panel-page/customer/ReservationRow.tsx#L26-L61)\n\n#### Panel administratora:\n\n- Zarządzanie wszystkimi rezerwacjami\n- Dostęp do raportów i statystyk\n- Zarządzanie menu i stolikami\n\nZobacz implementację w [page.tsx](https://github.com/majkeloess/przyjemnosc/blob/main/app/rezerwacje/panel/[id]/reservations/page.tsx#L1-L20)\n\n### Makropolecenia\n\n#### Automatyzacja procesów:\n\n1. **Zarządzanie rezerwacjami:**\n\n   - Automatyczna aktualizacja statusów\n   - Generowanie kodów lojalnościowych\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L87-L116)\n\n2. **System lojalnościowy:**\n\n   - Automatyczne generowanie kodów\n   - Walidacja i obsługa kodów\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L118-L177)\n\n3. **Walidacja danych:**\n\n   - Sprawdzanie dostępności stolików\n   - Kontrola nakładania się rezerwacji\n\n   Zobacz implementację w [schema.sql](https://github.com/majkeloess/przyjemnosc/blob/main/schema.sql#L344-L378)\n\n4. **Operacje na rezerwacjach:**\n\n   - Tworzenie rezerwacji z walidacją\n   - Anulowanie rezerwacji\n\n   Zobacz implementację w [mutations.ts](https://github.com/majkeloess/przyjemnosc/blob/main/lib/mutations.ts#L45-L190)\n\n## Dokumentacja\n\n### Wprowadzanie danych\n\n#### Metody wprowadzania danych:\n\n1. **Ręczne wprowadzanie**\n\n   - Poprzez formularze w interfejsie użytkownika\n   - Panel administracyjny dla zarządzania menu i stolikami\n   - System rejestracji i logowania użytkowników\n\n2. **Automatyczne generowanie**\n\n   - Automatyczne generowanie kodów lojalnościowych\n   - Aktualizacja statusów rezerwacji\n   - Generowanie raportów i statystyk\n\n3. **Skrypt seedujący**\n\n   - Inicjalne wypełnienie bazy przykładowymi danymi\n   - Generowanie testowych rezerwacji\n\n   ```sql\n   DO $$\n   DECLARE\n    curr_date timestamp;\n    reservation_time timestamp;\n    user_id uuid;\n    selected_table_id integer;\n    status_val restaurant.reservation_status;\n    reservation_id integer;\n    day integer;\n    hour integer;\n    minute integer;\n    date_str text;\n   BEGIN\n    day := 1;\n    WHILE day \u003c= 31 LOOP\n        date_str := '2025-01-' || LPAD(day::text, 2, '0');\n        curr_date := date_str::timestamp;\n\n        hour := 12;\n        WHILE hour \u003c= 21 LOOP\n            minute := 0;\n            WHILE minute \u003c= 30 LOOP\n                IF random() \u003c 0.7 THEN\n                    SELECT id INTO user_id\n                    FROM restaurant.users\n                    WHERE type = 'customer'::restaurant.user_type\n                    ORDER BY random()\n                    LIMIT 1;\n\n                    selected_table_id := floor(random() * 27 + 1);\n\n                    IF curr_date + (hour || ':' || minute)::interval \u003c NOW() THEN\n                        IF random() \u003c 0.1 THEN\n                            status_val := 'cancelled'::restaurant.reservation_status;\n                        ELSE\n                            status_val := 'done'::restaurant.reservation_status;\n                        END IF;\n                    ELSE\n                        status_val := 'pending'::restaurant.reservation_status;\n                    END IF;\n\n                    IF NOT EXISTS (\n                        SELECT 1\n                        FROM restaurant.reservations r\n                        JOIN restaurant.reservationtables rt ON r.id = rt.reservation_id\n                        WHERE rt.table_id = selected_table_id\n                        AND r.status = 'pending'::restaurant.reservation_status\n                        AND r.start_time \u003c= (curr_date + (hour || ':' || minute)::interval + interval '2 hours')\n                        AND r.end_time \u003e= (curr_date + (hour || ':' || minute)::interval)\n                    ) THEN\n                        INSERT INTO restaurant.reservations\n                            (user_id, start_time, end_time, status, source)\n                        VALUES\n                            (\n                                user_id,\n                                curr_date + (hour || ':' || minute)::interval,\n                                curr_date + (hour || ':' || minute)::interval + interval '2 hours',\n                                status_val,\n                                'page'::reservation_source\n                            )\n                        RETURNING id INTO reservation_id;\n\n                        INSERT INTO restaurant.reservationtables (reservation_id, table_id)\n                        VALUES (reservation_id, selected_table_id);\n                    END IF;\n                END IF;\n\n                minute := minute + 30;\n            END LOOP;\n            hour := hour + 1;\n        END LOOP;\n        day := day + 1;\n    END LOOP;\n   END $$;\n   ```\n\n### Dokumentacja użytkownika\n\n#### Dla klientów:\n\n1. **Rejestracja i logowanie**\n\n   - Wypełnij formularz rejestracji podając username, email i hasło\n   - Zaloguj się używając utworzonego konta\n\n2. **Dokonywanie rezerwacji**\n\n   - Wybierz datę i godzinę\n   - Określ liczbę osób\n   - Potwierdź rezerwację\n   - Sprawdź status w panelu użytkownika\n\n3. **Zarządzanie rezerwacjami**\n   - Przeglądaj aktywne rezerwacje\n   - Anuluj rezerwacje w razie potrzeby\n   - Wykorzystuj otrzymane kody lojalnościowe\n\n#### Dla administratorów:\n\n1. **Zarządzanie systemem**\n   - Przeglądaj wszystkie rezerwacje\n   - Zarządzaj stolikami i menu\n   - Generuj i analizuj raporty\n\n### Dokumentacja techniczna\n\n#### Stack technologiczny:\n\n```json:package.json\n  \"dependencies\": {\n    \"@types/bcrypt\": \"^5.0.2\",\n    \"@types/jsonwebtoken\": \"^9.0.7\",\n    \"bcrypt\": \"^5.1.1\",\n    \"d3-time\": \"^3.1.0\",\n    \"d3-time-format\": \"^4.1.0\",\n    \"jose\": \"^5.9.6\",\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"lodash\": \"^4.17.21\",\n    \"next\": \"15.0.3\",\n    \"pg\": \"^8.13.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"recharts\": \"^2.15.0\",\n    \"zod\": \"^3.24.1\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^20\",\n    \"@types/pg\": \"^8.11.10\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"postcss\": \"^8\",\n    \"tailwindcss\": \"^3.4.1\",\n    \"typescript\": \"^5\"\n  }\n```\n\n#### Główne komponenty systemu:\n\n1. **Frontend**\n\n   - Next.js 15.0.3\n   - React 18.2.0\n   - TailwindCSS\n   - TypeScript\n\n2. **Backend**\n\n   - PostgreSQL\n   - Node.js\n   - RESTful API\n\n3. **Bezpieczeństwo**\n   - JWT do autoryzacji\n   - Bcrypt do hashowania haseł\n   - Walidacja danych przez Zod\n\n### Wykaz literatury\n\n1. Dokumentacja Next.js - https://nextjs.org/docs\n2. Dokumentacja PostgreSQL - https://www.postgresql.org/docs/\n3. Dokumentacja React - https://react.dev/\n4. Dokumentacja TailwindCSS - https://tailwindcss.com/docs\n\n### Instalacja lokalna\n\n1. **Wymagania wstępne**\n\n   - Node.js (v18+)\n   - npm (v10+)\n   - PostgreSQL (v15+)\n   - Git\n\n2. **Kroki instalacji**\n\n#### Klonowanie repozytorium i instalacja\n\n```bash\n\ngit clone https://github.com/majkeloess/przyjemnosc\ncd przyjemnosc\nnpm install\n```\n\n#### Konfiguracja zmiennych środowiskowych\n\nUtwórz plik .env i dodaj:\n\n```.env\nDATABASE_URL=\"postgresql://username:password@localhost:5432/przyjemnosc\"\nJWT_SECRET=\"twoj-sekretny-klucz\"\nNEXT_PUBLIC_API_URL=\"http://localhost:3000\"\n```\n\n#### Utworzenie schematu bazy danych\n\n```bash\n\npsql -U postgres -d przyjemnosc -f schema.sql\n```\n\n#### Uruchomienie aplikacji w trybie developerskim\n\n```bash\nnpm run dev\n```\n\n3. **Struktura bazy danych**\n\n   - Utwórz bazę danych 'przyjemnosc'\n   - Wykonaj skrypt schema.sql\n   - Schemat 'restaurant' zostanie utworzony automatycznie\n   - Wszystkie tabele i funkcje zostaną utworzone w schemacie 'restaurant'\n\n4. **Pierwsze uruchomienie**\n\n   Aplikacja będzie dostępna pod adresem http://localhost:3000\n\n## Usprawnienia aplikacji\n\n- Dodanie do panelu administratora widoku jakie stoliki są dostępne w tym momencie\n- Zbudowanie systemu mailowego do rejestracji jak i do nadchodzących rezerwacji\n- Posiadanie pełnej funkcjonalności restauracji nie tylko rezerwacji a równiez obsługa zamówień i płatności\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmajkeloess%2Fprzyjemnosc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmajkeloess%2Fprzyjemnosc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmajkeloess%2Fprzyjemnosc/lists"}