# Indeks Skryptów - NORDA BIZNES HUB

## Skrypty Główne

### app.py
**Główna aplikacja Flask**
- Routing i widoki
- Czat AI (Gemini)
- Logowanie użytkowników
- Port: 5001

### database.py
**Modele bazy danych**
- Company model (24 pola)
- Category model
- User model
- SessionLocal factory

## Skrypty Importu Danych

### import_norda_batch4.py
**Batch 4 - 10 firm**
- SIM Rumia, TTM, VENCODE, VINDOR, VOLTRIM TRADE
- WDX, Wejherplast, Pucka Gospodarka Komunalna
- PHU S&K TOBACCO, PHU U Witka

**Status:** ✅ Wykonany (9 zaimportowanych, 1 skip)

### import_norda_batch5.py
**Batch 5 - 10 firm**
- GRAAL, Green House Systems, Hebel Masiak i Wspólnicy
- Kancelaria Radcy Prawnego Łukasz Gilewicz, KORNIX
- Lenap Hale, P&P, Pixlab Softwarehouse
- Radio Norda FM, Autotest Polska

**Status:** ✅ Wykonany (8 zaimportowanych, 2 skip)

## Skrypty Naprawcze

### fix_norda_database.py
**Kompleksowa naprawa bazy**

**3 kroki:**
1. Usunięcie Autotest Polska (nie jest członkiem NORDA)
2. Aktualizacja 9 nazw firm (zgodność z listą NORDA)
3. Import 4 brakujących firm (Batch 6):
   - Stalpunkt (NIP: 9571169754)
   - CoolAir (NIP: 9581678322)
   - MKonsult (NIP: 5882044171)
   - Portal (NIP: 5881830157)

**Status:** ✅ Wykonany
**Rezultat:** 78 unikalnych firm → 78 firm

### split_ttm_companies.py
**Podział TTM na 3 osobne wpisy**

**Operacje:**
1. Usunięcie UNIQUE constraint z kolumny NIP
2. Stworzenie 3 osobnych firm:
   - Nadmorski24.pl (slug: nadmorski24pl)
   - Radio Norda FM (slug: radio-norda-fm)
   - TTM (slug: ttm)
3. Usunięcie starego połączonego wpisu "TTM / Nadmorski24.pl"

**Wspólne dane (NIP: 5882285147):**
- Legal name: Twoja Telewizja Morska sp. z o.o.
- REGON: 220659444
- KRS: 0000311636

**Status:** ✅ Wykonany
**Rezultat:** 78 firm → 80 firm (100% pokrycie listy NORDA)

### update_ttm.py
**Aktualizacja danych TTM** (przed splitem)
- Dodanie REGON: 220659444
- Zmiana nazwy: "Nadmorski24.pl" → "TTM / Nadmorski24.pl"
- Aktualizacja opisów

**Status:** ✅ Wykonany (później zastąpione przez split_ttm_companies.py)

### remove_test_companies.py
**Usunięcie 10 firm testowych**
- Kryteria: ID <= 10 AND NIP like '567%'
- Firmy testowe stworzone podczas development

**Status:** ✅ Wykonany
**Rezultat:** 68 firm → 58 firm

## Skrypty Weryfikacyjne

### verify_norda_list.py (do stworzenia)
**Weryfikacja zgodności z listą NORDA**
- Porównanie bazy z https://norda-biznes.info/czlonkowie
- Znajdowanie rozbieżności
- Export raportu

## Funkcje Pomocnicze (w każdym skrypcie importu)

### create_slug(name: str) -> str
```python
def create_slug(name: str) -> str:
    """Create URL-friendly slug from company name"""
    slug = name.lower()
    replacements = {
        'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l',
        'ń': 'n', 'ó': 'o', 'ś': 's', 'ź': 'z', 'ż': 'z',
        '&': 'i', ' ': '-', '/': '-', ',': '', '.': '',
        '(': '', ')': '', '"': '', "'": ''
    }
    for old, new in replacements.items():
        slug = slug.replace(old, new)
    slug = re.sub(r'[^a-z0-9-]', '', slug)
    slug = re.sub(r'-+', '-', slug)
    slug = slug.strip('-')
    return slug
```

### parse_address(address: str) -> dict
```python
def parse_address(address: str) -> dict:
    """Parse address into components"""
    postal_match = re.search(r'(\d{2}-\d{3})\s+([A-ZĄĆĘŁŃÓŚŹŻ][a-ząćęłńóśźż\s]+)', address)
    if postal_match:
        postal = postal_match.group(1)
        city = postal_match.group(2).strip()
        street = address.split(postal)[0].strip().replace('ul.', '').strip()
        return {
            'street': street if street else None,
            'city': city,
            'postal': postal,
            'full': address
        }
    else:
        return {
            'street': None,
            'city': 'Wejherowo',
            'postal': None,
            'full': address
        }
```

## Kolejność Wykonywania Skryptów (historia)

```
1. remove_test_companies.py        → Usunięto 10 testowych firm
2. import_norda_batch4.py          → +9 firm (67 total)
3. update_ttm.py                   → Aktualizacja TTM
4. import_norda_batch5.py          → +8 firm (75 total)
5. fix_norda_database.py           → -1 firma, +4 firmy, ~9 nazw (78 total)
6. split_ttm_companies.py          → -1 wpis, +3 wpisy (80 total)
```

## Uruchamianie Skryptów

### Standard
```bash
python3 <script_name>.py
```

### Z output redirection
```bash
python3 <script_name>.py > output.log 2>&1
```

### Sprawdzenie przed uruchomieniem (DEV via Docker)
```bash
docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT COUNT(*) FROM companies;"
```

### Backup przed uruchomieniem (DEV via Docker)
```bash
docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > nordabiz_backup_before_<operation>.sql
```

## Wskazówki

1. **Zawsze** sprawdź stan bazy przed uruchomieniem skryptu
2. **Zawsze** zrób backup przed operacjami modyfikującymi
3. **Nigdy** nie uruchamiaj tego samego skryptu importu dwa razy (sprawdza NIP)
4. Skrypty importu są **idempotentne** - można bezpiecznie uruchomić ponownie
5. Dla operacji modyfikujących schemat (jak split_ttm_companies.py) - uruchom **tylko raz**

## Status Bazy Danych

**Aktualny stan:** 80 firm ✅
**Jakość danych:** Enhanced
**Ostatnia modyfikacja:** 2025-11-24 (split_ttm_companies.py)

---

**Uwaga:** Wszystkie skrypty importu używają `SessionLocal()` z database.py i automatycznie zamykają połączenie w bloku `finally`.
