# Notatki z prac nad NordaBiz - 2026-01-29

## Wykonane zadania

### 1. Upgrade NordaGPT do Gemini 3 Flash Preview (GŁÓWNA ZMIANA)
- **Zmiana:** Z Gemini 2.5 Flash-Lite na Gemini 3 Flash Preview
- **Korzyści:** 7x lepsze rozumowanie, thinking mode, 78% na SWE-bench
- **Pliki:** `app.py`, `gemini_service.py`, `templates/chat.html`
- **Commit:** `e0df7f2` (08:38)

### 2. Dwa modele AI do wyboru (GŁÓWNA ZMIANA)
- **Flash (darmowy):** Gemini 3 Flash Preview - szybki, bez opłat
- **Pro (płatny):** Gemini 3 Pro - lepszy, limit $2/dzień
- **Funkcje:**
  - Osobne klucze API (Free tier / Paid tier)
  - Wyświetlanie szacowanego kosztu miesięcznego
  - Wybór modelu w interfejsie czatu
- **Pliki:** `gemini_service.py`, `templates/chat.html`
- **Commity:** `26db9a7`, `1b2ba66` (11:04-11:19)

### 3. PWA - Aplikacja mobilna (GŁÓWNA ZMIANA)
- **Funkcja:** Możliwość instalacji portalu jako aplikacji na telefonie (iOS/Android)
- **Dodano:**
  - Web Manifest (`static/site.webmanifest`)
  - Ikony 192px i 512px
  - Apple Touch Icon dla iOS
- **Commit:** `eac72f4` (28 stycznia 23:44)

### 4. Naprawa błędów 500 w blueprintach
- **Problem:** `url_for('classifieds_index')` bez prefixu blueprintu powodował 500
- **Rozwiązanie:** Zmiana na `url_for('.classifieds_index')` (kropka = aktualny blueprint)
- **Pliki:** `blueprints/community/classifieds/routes.py`, `calendar/routes.py`, `contacts/routes.py`

### 5. Aktualizacja ikony NordaGPT na stronie głównej
- **Problem:** Stara ikona robota zamiast nowej ikony NordaGPT
- **Rozwiązanie:** Podmiana na SVG z `/static/img/nordagpt-icon.svg`
- **Plik:** `templates/index.html`

### 6. Integracja wideo z portalem
- **Dodano:** Modal player z wideo w sekcji Edukacja
- **Pliki:**
  - `blueprints/education/routes.py` - lista materiałów z URL wideo
  - `templates/education/index.html` - player, thumbnails, badge "Nowe"
- **Wideo:** `static/videos/nordabiz-zajawka-final.mp4`

### 7. Poprawki wideo zajawka (Remotion)
- **Zmiana:** Ostatnia scena - logo Norda Biznes zamiast ikony NordaGPT
- **Poprawka:** Polskie znaki ("Twoja sieć kontaktów", "Izba Przedsiębiorców NORDA")
- **Plik:** `remotion/my-video/src/NordaBizZajawka.tsx`

### 8. Ukrycie strony /aktualnosci
- Strona pozostaje w kodzie, ale nie jest linkowana
- Zostanie udostępniona w przyszłości na decyzję użytkownika

### 9. Reorganizacja kategorii ogłoszeń
**Nowe kategorie:**
| Kod | Etykieta |
|-----|----------|
| `internal` | Wewnętrzne |
| `external` | Zewnętrzne |
| `event` | Wydarzenie |
| `opportunity` | Okazja biznesowa |
| `partnership` | Partnerstwo |

- **Plik:** `database.py` - `CATEGORIES` i `CATEGORY_LABELS`

### 10. Usunięcie "Nowi członkowie" z footera
- **Plik:** `templates/base.html`

### 11. Obsługa wielu kategorii dla ogłoszeń (GŁÓWNA FUNKCJONALNOŚĆ)

**Zmiany w bazie danych:**
- Nowa kolumna: `categories TEXT[]` (tablica PostgreSQL)
- Migracja: `database/migrations/029_add_categories_array.sql`
- Indeks GIN dla szybkiego wyszukiwania

**Zmiany w backendzie:**
- Formularz admin: checkboxy zamiast select (wiele kategorii)
- Filtrowanie: operator PostgreSQL `@>` dla tablic
- Zachowanie kompatybilności wstecznej (pole `category`)

**Pliki:**
- `app.py` - routes `admin_announcements_new`, `admin_announcements_edit`, `announcements_list`
- `database.py` - model `Announcement` z nowymi metodami
- `templates/admin/announcements_form.html` - checkboxy kategorii
- `templates/announcements/list.html`, `detail.html` - wyświetlanie wielu badge'ów

**Składnia SQLAlchemy dla ARRAY:**
```python
# BŁĘDNE (generuje LIKE):
Announcement.categories.contains([category])

# POPRAWNE (operator @>):
from sqlalchemy.dialects.postgresql import array as pg_array
query.filter(Announcement.categories.op('@>')(pg_array([category])))
```

### 12. Aktualizacja istniejących ogłoszeń
- ID 11 (Baza zakwaterowania): `{external, opportunity}`
- ID 12 (Tytani Przedsiębiorczości): `{external, event}`

## Błędy naprawione podczas sesji

| Błąd | Przyczyna | Rozwiązanie |
|------|-----------|-------------|
| 500 na `/tablica/nowe` | Brak prefixu `.` w url_for | Dodanie kropki |
| 500 na `/ogloszenia?category=X` | `.any()` nie istnieje dla ARRAY | Użycie `.op('@>')` |
| 500 (malformed array literal) | `.contains()` generuje LIKE | Użycie `pg_array()` |

## Podsumowanie release v1.20.0

| Kategoria | Funkcjonalność |
|-----------|----------------|
| **AI** | Gemini 3 Flash Preview, dwa modele (Flash/Pro), osobne klucze API |
| **PWA** | Aplikacja mobilna dla iOS/Android |
| **Aktualności** | Wiele kategorii, nowe typy kategorii |
| **Edukacja** | Wideo w portalu |
| **Bugfixy** | Blueprinty, filtrowanie ARRAY |

## Do zrobienia (następna sesja)

- [ ] Nagranie tutorialu NordaGPT (30s) z użyciem GIFów z portalu
- [ ] Integracja z NotebookLM (podcast o portalu)
- [ ] Widget wideo na dashboardzie dla zalogowanych użytkowników

## Uwagi techniczne

- PostgreSQL ARRAY wymaga operatora `@>` do sprawdzania zawierania
- SQLAlchemy `.contains()` dla TEXT[] generuje błędne zapytanie LIKE
- Metoda `.any()` nie istnieje dla kolumn ARRAY w SQLAlchemy 2.0
- Prawidłowa składnia: `column.op('@>')(pg_array([value]))`
