# Norda Biznes - Database Setup

## 📦 Struktura

```
database/
├── schema.sql              # Pełny schemat bazy danych PostgreSQL
├── migrate-json-to-pg.js   # Skrypt migracji z JSON do PostgreSQL
├── README.md               # Ten plik
└── .env.example            # Przykładowa konfiguracja połączenia
```

---

## 🚀 Instalacja na NORDABIZ-01

### Krok 1: Instalacja PostgreSQL

```bash
# SSH do serwera
ssh root@10.22.68.249

# Aktualizacja pakietów
apt update

# Instalacja PostgreSQL 15
apt install -y postgresql-15 postgresql-contrib-15

# Sprawdzenie statusu
systemctl status postgresql

# Włączenie autostartu
systemctl enable postgresql
```

### Krok 2: Konfiguracja PostgreSQL

```bash
# Przełącz się na użytkownika postgres
sudo -u postgres psql

# W psql:
CREATE DATABASE nordabiz;
CREATE USER nordabiz_app WITH PASSWORD 'your_secure_password_here';
GRANT ALL PRIVILEGES ON DATABASE nordabiz TO nordabiz_app;

# Wyjdź z psql
\q
```

### Krok 3: Utworzenie schematu

```bash
# Jako użytkownik postgres
sudo -u postgres psql -d nordabiz -f /var/www/nordabiznes/database/schema.sql
```

### Krok 4: Weryfikacja

```bash
# Połącz się jako nordabiz_app
psql -U nordabiz_app -d nordabiz -h localhost

# W psql sprawdź tabele:
\dt

# Powinno pokazać wszystkie tabele:
# companies, categories, services, competencies, etc.

# Sprawdź dane referencyjne:
SELECT * FROM categories;
SELECT * FROM data_sources;

\q
```

---

## 📊 Schemat Bazy Danych

### Główne tabele:

#### **companies**
Podstawowe dane firm (NIP, REGON, KRS, adres, kontakt)

#### **categories**
Kategorie branżowe (IT, Produkcja, Handel, etc.)

#### **services**
Usługi oferowane przez firmy (Many-to-Many przez company_services)

#### **competencies**
Kompetencje i technologie (Many-to-Many przez company_competencies)

#### **certifications**
Certyfikaty i uprawnienia firm

#### **awards**
Nagrody i wyróżnienia (Gazele Biznesu, Diamenty Forbesa, etc.)

#### **financial_data**
Historyczne dane finansowe (przychody, zyski, aktywa)

#### **social_media**
Profile społecznościowe (Facebook, LinkedIn, Instagram)

#### **data_sources**
Źródła danych (ALEO.com, strony WWW, etc.)

#### **collection_log**
Log aktywności agenta zbierającego dane

### Widoki:

- **v_companies_full** - kompletny widok firm ze wszystkimi relacjami
- **v_data_quality_stats** - statystyki jakości danych
- **v_companies_incomplete** - firmy z brakującymi danymi

### Funkcje:

- **calculate_data_quality(company_id)** - oblicza poziom jakości danych
- **update_all_data_quality()** - aktualizuje jakość dla wszystkich firm

---

## 🔄 Migracja Danych z JSON

### Wymagania:

```bash
# W katalogu projektu
npm install pg
```

### Konfiguracja połączenia:

Utwórz plik `.env` w katalogu głównym projektu:

```bash
DB_HOST=localhost
DB_PORT=5432
DB_NAME=nordabiz
DB_USER=nordabiz_app
DB_PASSWORD=your_secure_password_here
```

Lub eksportuj zmienne środowiskowe:

```bash
export DB_HOST=localhost
export DB_PORT=5432
export DB_NAME=nordabiz
export DB_USER=nordabiz_app
export DB_PASSWORD=your_secure_password_here
```

### Uruchomienie migracji:

```bash
# Dry run - sprawdzenie bez zmian
node database/migrate-json-to-pg.js --dry-run

# Migracja z verbose output
node database/migrate-json-to-pg.js --verbose

# Standardowa migracja
node database/migrate-json-to-pg.js
```

### Przykładowy output:

```
🤖 Norda Biznes - JSON → PostgreSQL Migration
============================================================

📂 Wczytywanie danych JSON...
   ✅ Załadowano 10 firm z companies-full.json

🔌 Łączenie z bazą danych...
   Host: localhost:5432
   Database: nordabiz
   ✅ Połączono: 2025-11-23 19:00:00

📦 Migracja 10 firm...

[1] PIXLAB
   ✅ Dodano: PIXLAB (ID: 1)
   🔗 Usługi: 4
   🔗 Kompetencje: 3

[2] KORNIX
   ✅ Dodano: KORNIX (ID: 2)
   🔗 Usługi: 4
   🔗 Kompetencje: 3
   💰 Dane finansowe: 1

...

============================================================
📊 RAPORT MIGRACJI
============================================================

📋 Firmy:
   ✅ Dodane:          10
   🔄 Zaktualizowane:  0
   ❌ Błędy:           0

🔧 Usługi:
   🔗 Połączone:       40

💡 Kompetencje:
   🔗 Połączone:       30

🏆 Certyfikaty:      5
🥇 Nagrody:          15
💰 Dane finansowe:   10
📱 Social media:     8

============================================================

✅ Migracja zakończona pomyślnie!
```

---

## 🔍 Przydatne Zapytania SQL

### Statystyki ogólne:

```sql
-- Liczba firm według kategorii
SELECT c.name as category, COUNT(*) as count
FROM companies co
JOIN categories c ON co.category_id = c.id
GROUP BY c.name
ORDER BY count DESC;

-- Jakość danych
SELECT * FROM v_data_quality_stats;

-- Firmy z brakującymi danymi
SELECT * FROM v_companies_incomplete
LIMIT 20;
```

### Wyszukiwanie:

```sql
-- Pełnotekstowe wyszukiwanie
SELECT id, name, category_id, description_short
FROM companies
WHERE search_vector @@ plainto_tsquery('polish', 'oprogramowanie IT');

-- Firmy z konkretną usługą
SELECT co.name, s.name as service
FROM companies co
JOIN company_services cs ON co.id = cs.company_id
JOIN services s ON cs.service_id = s.id
WHERE s.slug = 'custom-software-development';

-- Firmy z konkretną kompetencją
SELECT co.name, c.name as competency
FROM companies co
JOIN company_competencies cc ON co.id = cc.company_id
JOIN competencies c ON cc.competency_id = c.id
WHERE c.slug = 'php';
```

### Raporty:

```sql
-- Top 10 firm po przychodach
SELECT co.name, fd.revenue, fd.year
FROM companies co
JOIN financial_data fd ON co.id = fd.company_id
ORDER BY fd.revenue DESC
LIMIT 10;

-- Firmy z najwi ększą liczbą certyfikatów
SELECT co.name, COUNT(ce.id) as cert_count
FROM companies co
LEFT JOIN certifications ce ON co.id = ce.company_id
GROUP BY co.name
ORDER BY cert_count DESC;

-- Pokrycie źródeł danych
SELECT ds.name, COUNT(cds.company_id) as companies_count
FROM data_sources ds
LEFT JOIN company_data_sources cds ON ds.id = cds.source_id
GROUP BY ds.name
ORDER BY companies_count DESC;
```

---

## 🔐 Backup i Restore

### Backup:

```bash
# Pełny backup bazy
pg_dump -U nordabiz_app -d nordabiz -F c -f nordabiz_backup_$(date +%Y%m%d).dump

# Tylko dane (bez schematu)
pg_dump -U nordabiz_app -d nordabiz --data-only -F c -f nordabiz_data_$(date +%Y%m%d).dump

# Tylko schemat (bez danych)
pg_dump -U nordabiz_app -d nordabiz --schema-only -f nordabiz_schema.sql
```

### Restore:

```bash
# Restore z dump
pg_restore -U nordabiz_app -d nordabiz_new nordabiz_backup_20251123.dump

# Restore z SQL
psql -U nordabiz_app -d nordabiz < nordabiz_schema.sql
```

### Automatyczny backup (cron):

```bash
# Dodaj do crontab:
crontab -e

# Backup codziennie o 3:00
0 3 * * * pg_dump -U nordabiz_app -d nordabiz -F c -f /backup/nordabiz_$(date +\%Y\%m\%d).dump

# Czyszczenie starych backupów (starsze niż 30 dni)
0 4 * * * find /backup -name "nordabiz_*.dump" -mtime +30 -delete
```

---

## 📈 Monitoring

### Rozmiar bazy:

```sql
SELECT
    pg_size_pretty(pg_database_size('nordabiz')) as database_size;

SELECT
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
```

### Aktywne połączenia:

```sql
SELECT
    datname,
    usename,
    application_name,
    client_addr,
    state,
    query
FROM pg_stat_activity
WHERE datname = 'nordabiz';
```

### Performance:

```sql
-- Najczęściej używane tabele
SELECT
    schemaname,
    tablename,
    seq_scan,
    idx_scan
FROM pg_stat_user_tables
ORDER BY seq_scan + idx_scan DESC;

-- Wolne zapytania (jeśli włączone logowanie)
SELECT
    query,
    mean_exec_time,
    calls
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
```

---

## 🛠️ Maintenance

### Vacuum:

```sql
-- Pełny vacuum analyze
VACUUM ANALYZE;

-- Dla konkretnej tabeli
VACUUM ANALYZE companies;
```

### Reindex:

```sql
-- Reindeksowanie bazy
REINDEX DATABASE nordabiz;

-- Dla konkretnej tabeli
REINDEX TABLE companies;
```

---

## 🐛 Troubleshooting

### Połączenie odmówione:

```bash
# Sprawdź czy PostgreSQL działa
systemctl status postgresql

# Sprawdź port
sudo netstat -plnt | grep 5432

# Sprawdź logi
sudo tail -f /var/log/postgresql/postgresql-15-main.log
```

### Uprawnienia:

```sql
-- Nadaj wszystkie uprawnienia
GRANT ALL PRIVILEGES ON DATABASE nordabiz TO nordabiz_app;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nordabiz_app;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nordabiz_app;
```

### Reset hasła:

```sql
-- Jako postgres
ALTER USER nordabiz_app WITH PASSWORD 'new_secure_password';
```

---

## 📚 Dokumentacja

- PostgreSQL: https://www.postgresql.org/docs/
- Node.js pg: https://node-postgres.com/
- Full-text search: https://www.postgresql.org/docs/current/textsearch.html

---

**Wersja:** 1.0
**Ostatnia aktualizacja:** 2025-11-23
**Autor:** Norda Biznes Hub Development Team
