nordabiz/SCRIPTS_INDEX.md
Maciej Pienczyn 69bb6b839a docs: Fix incorrect SQLite references - DEV uses PostgreSQL via Docker
The documentation incorrectly stated that DEV environment uses SQLite
when it actually uses PostgreSQL via Docker on localhost:5433.

Updated files:
- CLAUDE.md - main project instructions
- PROJECT_INFO.md - environment documentation
- deployment_checklist.md - deployment procedures
- SCRIPTS_INDEX.md - script usage commands
- .claude/commands/*.md - all slash command definitions
- tests/test_admin_seo_dashboard.py - test database URL

DEV environment:
- PostgreSQL via Docker: localhost:5433
- Container: nordabiz-postgres
- Database: nordabiz
- User: nordabiz_app

PROD environment:
- PostgreSQL: 10.22.68.249:5432

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 03:40:50 +01:00

5.4 KiB

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

Funkcje Pomocnicze (w każdym skrypcie importu)

create_slug(name: str) -> str

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

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

python3 <script_name>.py

Z output redirection

python3 <script_name>.py > output.log 2>&1

Sprawdzenie przed uruchomieniem (DEV via Docker)

docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT COUNT(*) FROM companies;"

Backup przed uruchomieniem (DEV via Docker)

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.