# Wdrożenie ETW — karta czasu pracy

Ta instrukcja prowadzi przez uruchomienie aplikacji pod adresem `czas.etwgroup.pl`. System składa się z:

- statycznej aplikacji w tym katalogu,
- bazy danych i logowania Supabase,
- hostingu strony, np. Vercel,
- rekordu DNS dla subdomeny ETW.

Nie umieszczaj w plikach aplikacji hasła do Supabase ani klucza `service_role`. Do `config.js` trafia wyłącznie klucz publiczny.

## 1. Załóż projekt Supabase

1. Załóż konto na [supabase.com](https://supabase.com) i utwórz nowy projekt, np. `etw-karta-pracy`.
2. Wybierz region europejski.
3. Zachowaj hasło do bazy w menedżerze haseł. Nie będzie potrzebne w przeglądarce pracowników.
4. Po utworzeniu projektu otwórz **SQL Editor**.
5. Skopiuj całą zawartość pliku `supabase/migrations/001_initial_schema.sql`, wklej ją do nowego zapytania i uruchom je przyciskiem **Run**.

Skrypt tworzy bazę, konta pracowników, miejsca pracy, karty miesięczne, historię zmian i zasady dostępu. Pracownik może odczytać wyłącznie własne wpisy. Konto właściciela może przeglądać zespół i zatwierdzać karty.

## 2. Utwórz konto właściciela

1. W Supabase przejdź do **Authentication → Users**.
2. Dodaj użytkownika `j.waszczuk@etwgroup.pl` i ustaw silne, unikalne hasło tymczasowe albo wyślij zaproszenie e-mail.
3. Wróć do **SQL Editor** i uruchom:

```sql
update public.profiles
set role = 'owner', full_name = 'Jakub Waszczuk'
where email = 'j.waszczuk@etwgroup.pl';
```

4. W **Authentication → Providers → Email** wyłącz samodzielną rejestrację nowych użytkowników. Konta ma tworzyć wyłącznie właściciel w panelu aplikacji.

## 3. Połącz aplikację z Supabase

1. W projekcie Supabase otwórz **Project Settings → API**.
2. Skopiuj `Project URL` oraz **publishable key**.
3. Otwórz plik `config.js` w tym katalogu i wstaw wartości:

```js
window.ETW_CONFIG = {
  supabaseUrl: "https://TWOJ-PROJEKT.supabase.co",
  supabasePublishableKey: "sb_publishable_...",
};
```

Klucz publiczny może być widoczny w aplikacji, ponieważ dostęp do rekordów ograniczają polityki RLS. Nigdy nie wpisuj tu `service_role` ani hasła do bazy. [Zasady zabezpieczania danych Supabase](https://supabase.com/docs/guides/database/secure-data)

## 4. Opublikuj stronę

### Czym jest Vercel?

Vercel jest usługą hostingową. W praktyce: umieszczasz tam folder z aplikacją, a Vercel daje jej tymczasowy adres internetowy, np. `etw-karta-pracy.vercel.app`. Dopiero potem podłączymy do niej firmowy adres `czas.etwgroup.pl`.

### Zrób to krok po kroku

1. Załóż konto na [github.com](https://github.com), jeśli go nie masz.
2. W GitHub kliknij **New repository**.
3. Nazwij repozytorium ``, wybierz widoczność **Private**, a następnie kliknij **Create repository**.
4. W nowym repozytorium wybierz **Add file → Upload files**.
5. Otwórz na komputerze folder [production](/Users/jakubwaszczuk/Documents/Codex/2026-09-13/pot/outputs/ewidencja-czasu-pracy/production) i przeciągnij do GitHub całą jego zawartość, łącznie z podfolderem `supabase`. Ważne: plik `index.html` ma być widoczny od razu po wejściu do repozytorium, a nie wewnątrz kolejnego folderu.
6. Na dole strony kliknij **Commit changes**.
7. Wejdź na [vercel.com](https://vercel.com) i zaloguj się przez konto GitHub.
8. Kliknij **Add New → Project**.
9. Przy repozytorium `etw-karta-pracy` kliknij **Import**.
10. Na ekranie konfiguracji ustaw:
    - `Project Name`: `etw-karta-pracy`,
    - `Framework Preset`: `Other`,
    - `Root Directory`: pozostaw pusty / `.` ,
    - `Build Command`: pozostaw pusty,
    - `Output Directory`: pozostaw pusty.
11. Kliknij **Deploy** i poczekaj na komunikat o powodzeniu.
12. Vercel pokaże tymczasowy adres zakończony na `.vercel.app`. Otwórz go. Jeżeli zobaczysz ekran „Konfiguracja wymagana”, to prawidłowe — aplikacja oczekuje jeszcze na dane z punktu 3.

Na tym etapie **nie zmieniaj jeszcze DNS**. Publikacja w Vercel nie wpływa na działającą stronę `etwgroup.pl`.

### Podłączenie subdomeny później

Po wykonaniu punktów 5 i 6 w Vercel wejdź do projektu, wybierz **Settings → Domains** i dodaj `czas.etwgroup.pl`. Vercel pokaże dokładny rekord DNS do dodania. W panelu DNS domeny `etwgroup.pl` dodaj wyłącznie ten rekord, zwykle `CNAME` o nazwie `czas`.

Po propagacji DNS Vercel automatycznie uruchomi certyfikat HTTPS.

## 5. Ustaw adresy i pocztę

Gdy `https://czas.etwgroup.pl` działa, ustaw w Supabase, w **Authentication → URL Configuration**:

- `Site URL`: `https://czas.etwgroup.pl`
- `Redirect URLs`: `https://czas.etwgroup.pl`

W produkcji podłącz także własne SMTP w **Authentication → Email**. Dzięki temu zaproszenia dla pracowników będą wysyłane z firmowej skrzynki, a nie z domyślnej poczty testowej. Jest to element zalecanej listy produkcyjnej Supabase. [Production Checklist](https://supabase.com/docs/guides/deployment/going-into-prod)

## 6. Wdróż funkcję zapraszania pracowników

Panel właściciela wywołuje zabezpieczoną funkcję `invite-employee`. Wymaga ona Supabase CLI zainstalowanego na komputerze.

Zainstaluj Supabase CLI, a następnie w terminalu, w katalogu `production`, uruchom:

```bash
supabase login
supabase link --project-ref TWOJ_PROJECT_REF
supabase secrets set ALLOWED_ORIGIN=https://czas.etwgroup.pl
supabase functions deploy invite-employee
```

`TWOJ_PROJECT_REF` znajdziesz w adresie projektu Supabase, np. `https://abcdefgh.supabase.co` oznacza `abcdefgh`.

Funkcja sprawdza, czy wywołująca ją osoba ma rolę właściciela, zanim wyśle zaproszenie. Klucz administracyjny Supabase pozostaje po stronie funkcji i nie trafia do aplikacji przeglądarkowej.

## 7. Test przed udostępnieniem zespołowi

Wykonaj test na własnym koncie i jednym testowym pracowniku:

1. Zaloguj się jako `j.waszczuk@etwgroup.pl`.
2. W **Panelu właściciela** dodaj przykładowe miejsca pracy.
3. Wyślij zaproszenie na testowy adres e-mail.
4. Zaloguj się jako testowy pracownik, dodaj pracę, delegację, dyżur oraz urlop.
5. Wyślij kartę do akceptacji i sprawdź, czy wpisy są zablokowane.
6. Zaloguj się jako właściciel, odeślij kartę do poprawy, a następnie ją zatwierdź.
7. Pobierz plik `.xlsx` i otwórz go w Excelu.
8. Sprawdź, że pracownik nie widzi danych drugiego pracownika ani panelu właściciela.

## 8. Start dla zespołu

Po teście:

1. Dodaj rzeczywiste miejsca pracy w panelu właściciela.
2. Wyślij zaproszenia maksymalnie do 10 pracowników.
3. Ustal wewnętrzny termin wysyłania kart, np. ostatni dzień roboczy miesiąca.
4. Przed rozliczeniem zaakceptuj każdą kartę i pobierz eksport Excel.

## Co jest już zabezpieczone

- brak samodzielnej rejestracji pracowników,
- role `owner` i `employee`,
- dostęp do danych ograniczony politykami RLS w bazie,
- blokada edycji po wysłaniu albo akceptacji karty,
- historia dodawania, edycji i usuwania wpisów,
- konto właściciela przypisane do `j.waszczuk@etwgroup.pl`.

## Co warto ustalić przed pierwszym rozliczeniem

Domyślnie aplikacja liczy normę jako 8 godzin w dni robocze, z możliwością ustawienia 6 lub 4 godzin przy zakładaniu konta. Przed pierwszym użyciem do celów kadrowych potwierdź zasady uwzględniania świąt, zwolnień lekarskich i odbioru nadgodzin z osobą prowadzącą kadry.
