diff --git a/.claude/DEPLOYMENT_STATE.md b/.claude/DEPLOYMENT_STATE.md
index 4051cff..1545768 100644
--- a/.claude/DEPLOYMENT_STATE.md
+++ b/.claude/DEPLOYMENT_STATE.md
@@ -2,7 +2,7 @@
## Status: WDROŻONE ✅
-Aplikacja Flask została pomyślnie wdrożona na NORDABIZ-01.
+Aplikacja Flask została pomyślnie wdrożona na OVH VPS inpi-vps-waw01.
## Ukończone kroki
@@ -16,12 +16,12 @@ Aplikacja Flask została pomyślnie wdrożona na NORDABIZ-01.
## Dostęp
-- **LAN:** http://10.22.68.249 ✅
+- **LAN:** http://57.128.200.27 ✅
- **WAN:** https://nordabiznes.pl (maintenance mode w NPM)
## Ważne informacje
-- **VM:** NORDABIZ-01 (ID 249, IP 10.22.68.249)
+- **VM:** OVH VPS inpi-vps-waw01 (ID 249, IP 57.128.200.27)
- **Baza:** PostgreSQL `nordabiz` (80 firm)
- **Port aplikacji:** 5000
- **Venv:** /var/www/nordabiznes/venv/
diff --git a/.claude/commands/add-company.md b/.claude/commands/add-company.md
index 6ed7640..a2db9b9 100644
--- a/.claude/commands/add-company.md
+++ b/.claude/commands/add-company.md
@@ -110,7 +110,7 @@ docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT slug,
## Uwagi:
- DEV: PostgreSQL via Docker na localhost:5433
-- PROD: PostgreSQL na 10.22.68.249:5432
+- PROD: PostgreSQL na 57.128.200.27:5432
- Dla produkcji: po przetestowaniu lokalnie, wdróż przez `/deploy`
- Nowe firmy powinny pochodzić z oficjalnej listy członków Norda Biznes
- Zawsze weryfikuj NIP przed dodaniem
diff --git a/.claude/commands/backup.md b/.claude/commands/backup.md
index bd2f9ee..b05906c 100644
--- a/.claude/commands/backup.md
+++ b/.claude/commands/backup.md
@@ -12,7 +12,7 @@ Opcjonalny argument określa typ backupu:
## System automatycznych backupów
-### Harmonogram (cron na NORDABIZ-01)
+### Harmonogram (cron na OVH VPS inpi-vps-waw01)
| Typ | Częstotliwość | Godzina | Retencja | Lokalizacja |
|-----|---------------|---------|----------|-------------|
@@ -25,16 +25,16 @@ Opcjonalny argument określa typ backupu:
```bash
# Ostatnie backupy hourly
-ssh maciejpi@10.22.68.249 "ls -lt /var/backups/nordabiz/hourly/ | head -5"
+ssh maciejpi@57.128.200.27 "ls -lt /var/backups/nordabiz/hourly/ | head -5"
# Ostatnie backupy daily
-ssh maciejpi@10.22.68.249 "ls -lt /var/backups/nordabiz/daily/ | head -5"
+ssh maciejpi@57.128.200.27 "ls -lt /var/backups/nordabiz/daily/ | head -5"
# Sprawdź offsite (PBS)
ssh maciejpi@10.22.68.127 "ls -lt /backup/nordabiz/daily/ | head -5"
# Rozmiar backupów
-ssh maciejpi@10.22.68.249 "du -sh /var/backups/nordabiz/*"
+ssh maciejpi@57.128.200.27 "du -sh /var/backups/nordabiz/*"
```
## Kroki do wykonania:
@@ -48,26 +48,26 @@ docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > "backups/dev_$(
### 2. Backup produkcyjnej bazy PostgreSQL
Eksport do lokalnego:
```bash
-ssh maciejpi@10.22.68.249 "sudo -u postgres pg_dump nordabiz" > "backups/prod_$(date +%Y%m%d_%H%M%S).sql"
+ssh maciejpi@57.128.200.27 "sudo -u postgres pg_dump nordabiz" > "backups/prod_$(date +%Y%m%d_%H%M%S).sql"
```
Lub backup na serwerze:
```bash
-ssh maciejpi@10.22.68.249 "sudo -u postgres pg_dump -Fc nordabiz > /tmp/backup_$(date +%Y%m%d_%H%M%S).dump"
+ssh maciejpi@57.128.200.27 "sudo -u postgres pg_dump -Fc nordabiz > /tmp/backup_$(date +%Y%m%d_%H%M%S).dump"
```
### 3. Backup plików konfiguracyjnych
```bash
mkdir -p backups/config_$(date +%Y%m%d)
cp .env backups/config_$(date +%Y%m%d)/dev.env
-ssh maciejpi@10.22.68.249 "cat /var/www/nordabiznes/.env" > backups/config_$(date +%Y%m%d)/prod.env
-ssh maciejpi@10.22.68.249 "cat /etc/nginx/sites-available/nordabiznes" > backups/config_$(date +%Y%m%d)/nginx.conf
+ssh maciejpi@57.128.200.27 "cat /var/www/nordabiznes/.env" > backups/config_$(date +%Y%m%d)/prod.env
+ssh maciejpi@57.128.200.27 "cat /etc/nginx/sites-available/nordabiznes" > backups/config_$(date +%Y%m%d)/nginx.conf
```
### 4. Snapshot VM w Proxmox
Użyj skill `proxmox-manager`:
```
-Utwórz snapshot VM NORDABIZ-01 (ID: 249) z opisem "Backup przed [operacja]"
+Utwórz snapshot VM OVH VPS inpi-vps-waw01 (OVH VPS) z opisem "Backup przed [operacja]"
```
Lub ręcznie:
@@ -83,14 +83,14 @@ ls -la backups/*.sql 2>/dev/null
Snapshoty VM (użyj skill proxmox-manager):
```
-Pokaż snapshoty VM 249
+Pokaż snapshoty OVH VPS
```
### 6. Przywracanie z backupu
#### Szybkie przywracanie (skrypt DR)
```bash
-ssh maciejpi@10.22.68.249 "sudo /var/www/nordabiznes/scripts/dr-restore.sh /var/backups/nordabiz/hourly/nordabiz_YYYYMMDD_HH.dump"
+ssh maciejpi@57.128.200.27 "sudo /var/www/nordabiznes/scripts/dr-restore.sh /var/backups/nordabiz/hourly/nordabiz_YYYYMMDD_HH.dump"
```
#### DEV (Docker PostgreSQL):
@@ -100,13 +100,13 @@ docker exec -i nordabiz-postgres psql -U nordabiz_app -d nordabiz < backups/dev_
#### PROD (PostgreSQL):
```bash
-cat backups/prod_YYYYMMDD_HHMMSS.sql | ssh maciejpi@10.22.68.249 "sudo -u postgres psql nordabiz"
+cat backups/prod_YYYYMMDD_HHMMSS.sql | ssh maciejpi@57.128.200.27 "sudo -u postgres psql nordabiz"
```
#### Rollback VM:
Użyj skill `proxmox-manager`:
```
-Przywróć VM 249 ze snapshotu backup_YYYYMMDD
+Przywróć OVH VPS ze snapshotu backup_YYYYMMDD
```
## Konfiguracja cron (na serwerze PROD)
@@ -162,6 +162,6 @@ sudo /var/www/nordabiznes/scripts/dr-restore.sh /path/to/backup.dump
- Snapshoty VM są najszybsze do rollbacku
- PostgreSQL dump jest przenośny między środowiskami
- DEV używa Docker PostgreSQL na localhost:5433
-- PROD używa PostgreSQL na 10.22.68.249:5432
+- PROD używa PostgreSQL na 57.128.200.27:5432
Data aktualizacji: 2026-02-02
diff --git a/.claude/commands/chat-stats.md b/.claude/commands/chat-stats.md
index a08c82e..bf59e03 100644
--- a/.claude/commands/chat-stats.md
+++ b/.claude/commands/chat-stats.md
@@ -99,4 +99,4 @@ Podsumuj w czytelnej formie:
- Monitoruj tokeny dla kontroli limitów
- Wysokie latency może wskazywać na problemy z API
- DEV: `docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz`
-- PROD: `ssh maciejpi@10.22.68.249 "sudo -u postgres psql -d nordabiz"`
+- PROD: `ssh maciejpi@57.128.200.27 "sudo -u postgres psql -d nordabiz"`
diff --git a/.claude/commands/data-report.md b/.claude/commands/data-report.md
index 22cb592..124588e 100644
--- a/.claude/commands/data-report.md
+++ b/.claude/commands/data-report.md
@@ -127,4 +127,4 @@ Wygeneruj raport w formacie markdown z tabelami:
- Priorytet: email > telefon > www > opis
- Weryfikuj dane przez oficjalne źródła (CEIDG, KRS)
- DEV: `docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz`
-- PROD: `ssh maciejpi@10.22.68.249 "sudo -u postgres psql -d nordabiz"`
+- PROD: `ssh maciejpi@57.128.200.27 "sudo -u postgres psql -d nordabiz"`
diff --git a/.claude/commands/deploy.md b/.claude/commands/deploy.md
index 1674846..5497db7 100644
--- a/.claude/commands/deploy.md
+++ b/.claude/commands/deploy.md
@@ -1,6 +1,6 @@
# Deploy NordaBiz to Production
-Wykonaj deployment projektu NordaBiz na serwer produkcyjny NORDABIZ-01.
+Wykonaj deployment projektu NordaBiz na serwer produkcyjny OVH VPS inpi-vps-waw01.
## Kroki do wykonania:
@@ -10,7 +10,7 @@ Wykonaj deployment projektu NordaBiz na serwer produkcyjny NORDABIZ-01.
- Sprawdź czy lokalna aplikacja działa: `curl http://localhost:5000/health` lub `curl http://localhost:5001/health`
### 2. Połączenie z serwerem
-- SSH do NORDABIZ-01: `ssh root@10.22.68.249`
+- SSH do OVH VPS inpi-vps-waw01: `ssh maciejpi@57.128.200.27`
- Przejdź do katalogu: `cd /var/www/nordabiznes`
### 3. Deployment
diff --git a/.claude/commands/logs.md b/.claude/commands/logs.md
index 5830802..ec1cfce 100644
--- a/.claude/commands/logs.md
+++ b/.claude/commands/logs.md
@@ -15,54 +15,54 @@ Opcjonalny argument określa typ logów lub liczbę linii, np.:
Połącz się z serwerem i pobierz logi:
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes -n 50 --no-pager"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes -n 50 --no-pager"
```
Dla więcej linii:
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes -n 100 --no-pager"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes -n 100 --no-pager"
```
Tylko błędy:
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes -p err -n 50 --no-pager"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes -p err -n 50 --no-pager"
```
### 2. Logi Nginx (access)
```bash
-ssh root@10.22.68.249 "tail -50 /var/log/nginx/access.log"
+ssh maciejpi@57.128.200.27 "tail -50 /var/log/nginx/access.log"
```
### 3. Logi Nginx (error)
```bash
-ssh root@10.22.68.249 "tail -50 /var/log/nginx/error.log"
+ssh maciejpi@57.128.200.27 "tail -50 /var/log/nginx/error.log"
```
### 4. Logi w czasie rzeczywistym (follow)
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes -f"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes -f"
```
(Ctrl+C aby przerwać)
### 5. Logi z określonego czasu
Ostatnia godzina:
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes --since '1 hour ago' --no-pager"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes --since '1 hour ago' --no-pager"
```
Dzisiaj:
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes --since today --no-pager"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes --since today --no-pager"
```
### 6. Szukanie wzorca
```bash
-ssh root@10.22.68.249 "journalctl -u nordabiznes --no-pager | grep -i 'error\|exception\|failed'"
+ssh maciejpi@57.128.200.27 "journalctl -u nordabiznes --no-pager | grep -i 'error\|exception\|failed'"
```
### 7. Status usługi
```bash
-ssh root@10.22.68.249 "systemctl status nordabiznes"
+ssh maciejpi@57.128.200.27 "systemctl status nordabiznes"
```
## Analiza logów:
@@ -74,7 +74,7 @@ Po pobraniu logów przeanalizuj je pod kątem:
- Nieautoryzowanych prób dostępu
## Uwagi:
-- Serwer: NORDABIZ-01 (VM 249, IP 10.22.68.249)
+- Serwer: OVH VPS inpi-vps-waw01 (OVH VPS, IP 57.128.200.27)
- Usługa systemd: `nordabiznes`
- Logi rotują automatycznie
- Dla alertów rozważ integrację z Zabbix (skill: monitoring-manager)
diff --git a/.claude/commands/status.md b/.claude/commands/status.md
index 84e9d66..4cfb974 100644
--- a/.claude/commands/status.md
+++ b/.claude/commands/status.md
@@ -18,7 +18,7 @@ Sprawdź aktualny status projektu NordaBiz - lokalnie i na produkcji.
- Test SSL: `curl -vI https://nordabiznes.pl 2>&1 | grep -E "(SSL|expire|subject)"`
### 3. Status VM (użyj skill proxmox-manager)
-- VM: NORDABIZ-01 (ID: 249)
+- VM: OVH VPS inpi-vps-waw01 (OVH VPS)
- Sprawdź: CPU, RAM, uptime, snapshoty
### 4. Statystyki bazy danych (DEV via Docker)
@@ -33,7 +33,7 @@ SELECT 'Wiadomości chat: ' || COUNT(*) FROM ai_chat_messages;
### 5. Statystyki bazy danych (PROD)
```bash
-ssh maciejpi@10.22.68.249 "sudo -u postgres psql -d nordabiz -c \"
+ssh maciejpi@57.128.200.27 "sudo -u postgres psql -d nordabiz -c \"
SELECT 'Firmy: ' || COUNT(*) FROM companies;
SELECT 'Użytkownicy: ' || COUNT(*) FROM users;
SELECT 'Konwersacje chat: ' || COUNT(*) FROM ai_chat_conversations;
@@ -52,11 +52,11 @@ Podsumuj status w formie tabeli:
| Lokalna aplikacja | OK/ERROR | port |
| Docker PostgreSQL | OK/ERROR | localhost:5433 |
| Produkcja | OK/ERROR | response time |
-| VM NORDABIZ-01 | OK/ERROR | uptime |
+| VM OVH VPS inpi-vps-waw01 | OK/ERROR | uptime |
| Baza danych DEV | OK/ERROR | liczba rekordów |
| Baza danych PROD | OK/ERROR | liczba rekordów |
| Git | CLEAN/DIRTY | branch |
## Uwagi:
- DEV: PostgreSQL via Docker na localhost:5433
-- PROD: PostgreSQL na 10.22.68.249:5432
+- PROD: PostgreSQL na 57.128.200.27:5432
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..1380a10
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,67 @@
+# NordaBiz — Agent Instructions
+
+Platform: katalog firm i networking dla Izby Gospodarczej Norda Biznes (Wejherowo).
+Production: https://nordabiznes.pl | Status: LIVE
+
+## Stack
+
+- **Backend:** Flask 3.0, SQLAlchemy 2.0, Python 3.9+, PostgreSQL
+- **Frontend:** HTML5, CSS3, Vanilla JS, Jinja2
+- **AI:** Google Gemini 3 Flash (free tier) — moduł NordaGPT
+- **Security:** Flask-Login, Flask-WTF (CSRF), Flask-Limiter
+
+## Project Structure
+
+```
+app.py # Main Flask app (routes, auth, API)
+database.py # SQLAlchemy models (Company, User, Chat, Forum...)
+gemini_service.py # Google Gemini AI integration
+nordabiz_chat.py # AI chat engine with company context
+search_service.py # Unified SearchService (synonyms, FTS, fuzzy)
+blueprints/ # 17 Flask blueprints (modular routes)
+templates/ # Jinja2 templates
+static/ # CSS, JS, images
+database/ # SQL schemas, migrations
+scripts/ # Python/Node.js utilities
+tests/ # Unit + integration tests
+```
+
+## Key Conventions
+
+- **Slug format:** kebab-case, e.g. `pixlab-sp-z-o-o`
+- **NIP:** 10 digits, no dashes | **REGON:** 9 or 14 digits | **KRS:** 10 digits (companies only)
+- **Categories:** `IT`, `Construction`, `Services`, `Production`, `Trade`, `Other`
+- **Data quality levels:** `basic`, `enhanced`, `complete`
+
+## Database
+
+- **Dev:** PostgreSQL via Docker (`localhost:5433/nordabiz`)
+- **Prod:** PostgreSQL on 57.128.200.27:5432 (OVH VPS inpi-vps-waw01, localhost from server)
+- After creating tables: `GRANT ALL ON TABLE ... TO nordabiz_app`
+- After creating sequences: `GRANT USAGE, SELECT ON SEQUENCE ... TO nordabiz_app`
+
+## Running Locally
+
+```bash
+docker compose up -d # Start PostgreSQL
+python3 app.py # Start Flask (port 5000 or 5001)
+```
+
+## Tests
+
+```bash
+pytest tests/ -v # All tests
+pytest tests/unit/ -v # Unit tests (no DB)
+pytest tests/integration/ -v # Integration tests (with DB)
+```
+
+## Jinja2 Templates — IMPORTANT
+
+`{% block extra_js %}` in `base.html` is INSIDE a `
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add templates/messages/conversations.html
+git commit -m "feat(messages): add conversation view template"
+```
+
+---
+
+## Task 10: Frontend — JavaScript
+
+**Files:**
+- Create: `static/js/conversations.js`
+
+- [ ] **Step 1: Create conversations.js**
+
+Main JS file handling all client-side logic. Modules (as functions/objects, no build step):
+
+**ConversationList** — render conversation items, handle selection, search filtering, update on new messages, unread badges, muted/archived indicators
+
+**ChatView** — render messages for selected conversation, cursor-based scroll-up loading, scroll to bottom on new message, date separators, read receipt indicators (ptaszki for 1:1, avatars for groups)
+
+**MessageActions** — context menu on hover/long-press: reply, react, forward, pin, edit, delete. Reply-to quote UI. Edit mode. Delete confirmation.
+
+**Reactions** — emoji picker (6 emoji), toggle reaction via API, render pill badges, update via SSE
+
+**Composer** — Quill editor init, send on Enter (Shift+Enter = newline), attachment drag&drop (reuse existing pattern from compose.html), typing indicator (debounce 2s, POST to /api/conversations//typing)
+
+**SSEClient** — connect to /api/messages/stream, handle events (new_message, message_read, typing, reaction, message_edited, message_deleted, message_pinned, presence), heartbeat every 30s, auto-reconnect on disconnect
+
+**Presence** — batch fetch /api/users/presence for visible conversation members, update online dots and "last seen" text, refresh every 60s
+
+**Search** — filter conversation list client-side by name, search within conversation via API
+
+**Pins** — fetch/render pinned messages bar, pin/unpin actions
+
+**LinkPreview** — render link_preview JSON as card under message content
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add static/js/conversations.js
+git commit -m "feat(messages): add conversation view JavaScript"
+```
+
+---
+
+## Task 11: Old Routes — Redirect + Backward Compat
+
+**Files:**
+- Modify: `blueprints/messages/routes.py`
+
+- [ ] **Step 1: Redirect old inbox/sent to new view**
+
+At the top of `messages_inbox` and `messages_sent` functions, add redirect:
+
+```python
+@bp.route('/wiadomosci/stare')
+@login_required
+@member_required
+def messages_inbox():
+ # Old inbox — keep for direct links but redirect
+ ...existing code...
+
+# New primary route
+@bp.route('/wiadomosci')
+@login_required
+@member_required
+def conversations_view():
+ return redirect(url_for('messages.conversations'))
+```
+
+Change old `/wiadomosci` route to `/wiadomosci/stare` so existing bookmarks still work but new links go to conversations view.
+
+- [ ] **Step 2: Update nav links**
+
+In `templates/base.html`, update the messages nav link to point to new route.
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add blueprints/messages/routes.py templates/base.html
+git commit -m "feat(messages): redirect old inbox to new conversation view"
+```
+
+---
+
+## Task 12: Data Migration Script
+
+**Files:**
+- Create: `scripts/migrate_messages.py`
+
+- [ ] **Step 1: Create migration script**
+
+Script that:
+1. Groups private_messages by unique (sender_id, recipient_id) pairs → creates Conversation per pair (is_group=False)
+2. Maps message_group → Conversation (is_group=True) with name, owner
+3. Maps message_group_member → ConversationMember with role, last_read_at
+4. Maps private_messages → ConvMessage preserving content, sender_id, created_at
+5. Maps parent_id → reply_to_id using old→new ID mapping
+6. Maps group_message → ConvMessage
+7. Updates message_attachments.conv_message_id using old→new mapping
+8. Sets conversation.last_message_id and updated_at
+9. Computes last_read_at for 1:1 members from PrivateMessage.read_at
+10. Validation: count old messages == count new messages, print summary
+
+Usage: `DATABASE_URL=... python3 scripts/migrate_messages.py [--dry-run]`
+
+- [ ] **Step 2: Test on dev database**
+
+```bash
+# Start Docker DB
+docker compose up -d
+
+# Run migration (dry run)
+DATABASE_URL=postgresql://nordabiz:nordabiz@localhost:5433/nordabiz python3 scripts/migrate_messages.py --dry-run
+
+# Run migration (real)
+DATABASE_URL=postgresql://nordabiz:nordabiz@localhost:5433/nordabiz python3 scripts/migrate_messages.py
+```
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add scripts/migrate_messages.py
+git commit -m "feat(messages): add data migration script (old → unified model)"
+```
+
+---
+
+## Task 13: Nginx SSE Configuration
+
+**Files:**
+- No code files — server configuration via SSH
+
+- [ ] **Step 1: Add SSE proxy config on staging**
+
+SSH to R11-REVPROXY-01 and add custom nginx config for the SSE endpoint:
+
+```nginx
+location /api/messages/stream {
+ proxy_pass http://10.22.68.248:5000;
+ proxy_set_header Connection '';
+ proxy_http_version 1.1;
+ chunked_transfer_encoding off;
+ proxy_buffering off;
+ proxy_cache off;
+ proxy_read_timeout 86400s;
+}
+```
+
+This can be added via NPM's "Advanced" tab for the staging proxy host (ID 44).
+
+- [ ] **Step 2: Test SSE on staging**
+
+```bash
+curl -N -H "Cookie: session=..." https://staging.nordabiznes.pl/api/messages/stream
+```
+
+Should receive `data: {"event": "connected"}` immediately.
+
+- [ ] **Step 3: Document**
+
+Add SSE config note to `docs/architecture/08-critical-configurations.md`.
+
+---
+
+## Task 14: Deploy + Production Migration
+
+- [ ] **Step 1: Install Redis on production VM**
+
+```bash
+ssh maciejpi@57.128.200.27 "sudo apt install redis-server -y && sudo systemctl enable redis-server"
+```
+
+- [ ] **Step 2: Deploy code to staging**
+
+```bash
+git push origin master && git push inpi master
+ssh maciejpi@10.22.68.248 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
+```
+
+- [ ] **Step 3: Run migration on staging**
+
+```bash
+# Schema
+ssh maciejpi@10.22.68.248 "cd /var/www/nordabiznes && DATABASE_URL=\$(grep DATABASE_URL .env | cut -d'=' -f2) /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/091_messaging_redesign.sql"
+
+# Data migration
+ssh maciejpi@10.22.68.248 "cd /var/www/nordabiznes && DATABASE_URL=\$(grep DATABASE_URL .env | cut -d'=' -f2) /var/www/nordabiznes/venv/bin/python3 scripts/migrate_messages.py"
+```
+
+- [ ] **Step 4: Test on staging**
+
+Verify at `https://staging.nordabiznes.pl/wiadomosci`:
+- Conversation list renders with migrated data
+- Opening a conversation shows message history
+- Sending a message works
+- SSE events arrive in real-time
+- Reactions, pins, typing indicator work
+- Mobile view works
+
+- [ ] **Step 5: Deploy to production (after staging verification)**
+
+```bash
+# Same steps as staging but on 57.128.200.27
+# Plus: add SSE nginx config to production proxy host (ID 27)
+```
+
+- [ ] **Step 6: Update release notes**
+
+Add to `_get_releases()` in `blueprints/public/routes.py`.
+
+---
+
+## Task 15: Unit Tests
+
+**Files:**
+- Create: `tests/unit/test_conversation_models.py`
+- Create: `tests/unit/test_conversation_api.py`
+- Create: `tests/unit/test_link_preview.py`
+
+- [ ] **Step 1: Model tests**
+
+Test Conversation, ConversationMember, ConvMessage creation, relationships, display_name property, member_count.
+
+- [ ] **Step 2: Link preview tests**
+
+Test URL extraction, OG parsing, internal domain skipping, timeout handling.
+
+- [ ] **Step 3: API tests**
+
+Test conversation creation (1:1 dedup), message sending, reaction toggle, pin/unpin, mute/archive settings, membership checks.
+
+- [ ] **Step 4: Run all tests**
+
+```bash
+pytest tests/unit/test_conversation_models.py tests/unit/test_conversation_api.py tests/unit/test_link_preview.py -v
+```
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add tests/unit/test_conversation_*.py tests/unit/test_link_preview.py
+git commit -m "test(messages): add unit tests for conversation system"
+```
diff --git a/docs/superpowers/plans/2026-03-28-nordagpt-identity-memory.md b/docs/superpowers/plans/2026-03-28-nordagpt-identity-memory.md
index 6541ad9..36cb3a1 100644
--- a/docs/superpowers/plans/2026-03-28-nordagpt-identity-memory.md
+++ b/docs/superpowers/plans/2026-03-28-nordagpt-identity-memory.md
@@ -257,7 +257,7 @@ Type "Co wiesz o mnie?" — verify AI lists your profile data.
- [ ] **Step 4: Deploy to production**
```bash
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
curl -sI https://nordabiznes.pl/health | head -3
```
@@ -918,7 +918,7 @@ ssh maciejpi@10.22.68.248 "journalctl -u nordabiznes -n 30 --no-pager | grep 'Ro
- [ ] **Step 3: Deploy to production**
```bash
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
curl -sI https://nordabiznes.pl/health | head -3
```
@@ -1343,7 +1343,7 @@ git commit -m "feat(nordagpt): streaming UI — word-by-word response with think
SSE requires Nginx to NOT buffer the response. The streaming endpoint sets `X-Accel-Buffering: no` header. Verify NPM custom config allows this:
```bash
-ssh maciejpi@10.22.68.249 "cat /etc/nginx/sites-enabled/nordabiznes.conf 2>/dev/null || echo 'Using NPM proxy'"
+ssh maciejpi@57.128.200.27 "cat /etc/nginx/sites-enabled/nordabiznes.conf 2>/dev/null || echo 'Using NPM proxy'"
```
If using NPM, the `X-Accel-Buffering: no` header should be sufficient. If not, add to NPM custom Nginx config for nordabiznes.pl:
@@ -1364,7 +1364,7 @@ Test on staging: open chat, send message, verify text appears word-by-word.
- [ ] **Step 3: Deploy to production**
```bash
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && sudo -u www-data git pull && sudo systemctl restart nordabiznes"
curl -sI https://nordabiznes.pl/health | head -3
```
@@ -1901,10 +1901,10 @@ ssh maciejpi@10.22.68.248 "sudo systemctl restart nordabiznes"
- [ ] **Step 4: Deploy to production**
```bash
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull"
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && DATABASE_URL=\$(grep DATABASE_URL .env | cut -d'=' -f2) /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/092_ai_user_memory.sql"
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && DATABASE_URL=\$(grep DATABASE_URL .env | cut -d'=' -f2) /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/093_ai_conversation_summary.sql"
-ssh maciejpi@10.22.68.249 "sudo systemctl restart nordabiznes"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && sudo -u www-data git pull"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && DATABASE_URL=\$(grep DATABASE_URL .env | cut -d'=' -f2) /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/092_ai_user_memory.sql"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && DATABASE_URL=\$(grep DATABASE_URL .env | cut -d'=' -f2) /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/093_ai_conversation_summary.sql"
+ssh maciejpi@57.128.200.27 "sudo systemctl restart nordabiznes"
curl -sI https://nordabiznes.pl/health | head -3
```
diff --git a/docs/superpowers/plans/2026-03-31-event-guests.md b/docs/superpowers/plans/2026-03-31-event-guests.md
index 550e676..cb01c18 100644
--- a/docs/superpowers/plans/2026-03-31-event-guests.md
+++ b/docs/superpowers/plans/2026-03-31-event-guests.md
@@ -10,7 +10,7 @@
**Spec:** `docs/superpowers/specs/2026-03-31-event-guests-design.md`
-**Deployment:** Staging first (`10.22.68.248`), user tests, then production (`10.22.68.249`).
+**Deployment:** Staging first (`10.22.68.248`), user tests, then production (`57.128.200.27`).
---
@@ -749,19 +749,19 @@ Expected: `HTTP/2 200`
- [ ] **Step 1: Deploy to production**
```bash
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && sudo -u www-data git pull"
```
- [ ] **Step 2: Run migration on production**
```bash
-ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/096_event_guests.sql"
+ssh maciejpi@57.128.200.27 "cd /var/www/nordabiznes && /var/www/nordabiznes/venv/bin/python3 scripts/run_migration.py database/migrations/096_event_guests.sql"
```
- [ ] **Step 3: Reload service**
```bash
-ssh maciejpi@10.22.68.249 "sudo systemctl reload nordabiznes"
+ssh maciejpi@57.128.200.27 "sudo systemctl reload nordabiznes"
```
- [ ] **Step 4: Verify production**
diff --git a/docs/superpowers/specs/2026-03-15-uptime-monitoring-design.md b/docs/superpowers/specs/2026-03-15-uptime-monitoring-design.md
index f56ec15..213e793 100644
--- a/docs/superpowers/specs/2026-03-15-uptime-monitoring-design.md
+++ b/docs/superpowers/specs/2026-03-15-uptime-monitoring-design.md
@@ -17,7 +17,7 @@ Podejście B: UptimeRobot (zewnętrzny monitoring) + wewnętrzny health logger z
## Architektura
```
-UptimeRobot.com (free) NORDABIZ-01 (10.22.68.249)
+UptimeRobot.com (free) NORDABIZ-01 (57.128.200.27)
│ sprawdza co 5 min │ wewnętrzny logger co 5 min
│ HTTPS → nordabiznes.pl │ app/db/cpu/ram/disk → PostgreSQL
│ │
diff --git a/docs/superpowers/specs/2026-03-27-messaging-redesign-design.md b/docs/superpowers/specs/2026-03-27-messaging-redesign-design.md
new file mode 100644
index 0000000..68765b9
--- /dev/null
+++ b/docs/superpowers/specs/2026-03-27-messaging-redesign-design.md
@@ -0,0 +1,189 @@
+# Messaging Redesign — Conversation-Based System
+
+**Data:** 2026-03-27
+**Status:** Zaakceptowany
+**Zakres:** Przebudowa systemu wiadomości z email-like (Odebrane/Wysłane) na konwersacyjny (Messenger/WhatsApp)
+
+## Decyzje architektoniczne
+
+1. **Ujednolicony model** — 1:1 i grupy w jednym modelu `Conversation` + `Message`. Rozmowa 1:1 = konwersacja z 2 uczestnikami.
+2. **Real-time: SSE** — Server-Sent Events + Redis pub/sub. Jedno połączenie SSE per użytkownik.
+3. **Migracja danych** — istniejące wiadomości migrowane do nowego modelu. Stare tabele zostają jako backup.
+
+## Model danych
+
+### conversations
+| Kolumna | Typ | Opis |
+|---------|-----|------|
+| id | Serial PK | |
+| name | String(255), nullable | Null dla 1:1, nadana nazwa dla grup |
+| is_group | Boolean | False = 1:1, True = grupa |
+| owner_id | FK → users | Twórca |
+| created_at | DateTime | |
+| updated_at | DateTime | Aktualizowane przy każdej wiadomości |
+| last_message_id | FK → messages, nullable | Denormalizacja dla listy |
+
+### conversation_members
+| Kolumna | Typ | Opis |
+|---------|-----|------|
+| conversation_id | FK → conversations, PK | |
+| user_id | FK → users, PK | |
+| role | String(20) | 'owner', 'member' |
+| last_read_at | DateTime | Read receipts |
+| is_muted | Boolean | Wyciszenie email + push |
+| is_archived | Boolean | Ukrycie z listy |
+| joined_at | DateTime | |
+| added_by_id | FK → users, nullable | |
+
+### messages
+| Kolumna | Typ | Opis |
+|---------|-----|------|
+| id | Serial PK | |
+| conversation_id | FK → conversations | |
+| sender_id | FK → users | |
+| content | Text | HTML (Quill) |
+| reply_to_id | FK → messages, nullable | Cytowanie |
+| edited_at | DateTime, nullable | |
+| is_deleted | Boolean | Soft delete |
+| link_preview | JSONB, nullable | {url, title, description, image} |
+| created_at | DateTime | |
+
+### message_reactions
+| Kolumna | Typ | Opis |
+|---------|-----|------|
+| id | Serial PK | |
+| message_id | FK → messages | |
+| user_id | FK → users | |
+| emoji | String(10) | |
+| created_at | DateTime | |
+| UNIQUE | (message_id, user_id, emoji) | |
+
+### message_pins
+| Kolumna | Typ | Opis |
+|---------|-----|------|
+| id | Serial PK | |
+| conversation_id | FK → conversations | |
+| message_id | FK → messages | |
+| pinned_by_id | FK → users | |
+| created_at | DateTime | |
+
+### message_attachments
+Istniejąca tabela. Nowa kolumna `new_message_id` FK → messages, nullable.
+
+## SSE Real-time
+
+### Endpoint
+`GET /api/messages/stream` — jedno połączenie per użytkownik.
+
+### Zdarzenia
+| Event | Dane | Kiedy |
+|-------|------|-------|
+| new_message | conversation_id, message JSON | Nowa wiadomość |
+| message_read | conversation_id, user_id, read_at | Przeczytano |
+| typing | conversation_id, user_id, user_name | Ktoś pisze (TTL 3s) |
+| reaction | message_id, user_id, emoji, action | Reakcja |
+| message_edited | message_id, new_content, edited_at | Edycja |
+| message_deleted | message_id, conversation_id | Usunięcie |
+| message_pinned | message_id, conversation_id, pinned_by | Przypięcie |
+| presence | user_id, status, last_seen | Online/offline |
+
+### Infrastruktura
+- Redis pub/sub do rozgłaszania między workerami Gunicorn
+- Online status: Redis SETEX z TTL 60s, heartbeat co 30s
+- Typing: POST /api/conversations//typing → Redis publish, TTL 3s
+
+## API Endpoints
+
+### Konwersacje
+| Method | URL | Opis |
+|--------|-----|------|
+| GET | /wiadomosci | Widok konwersacyjny (HTML) |
+| GET | /api/conversations | Lista konwersacji JSON |
+| POST | /api/conversations | Nowa (deduplikacja 1:1) |
+| GET | /api/conversations/ | Szczegóły + członkowie |
+| PATCH | /api/conversations/ | Edytuj nazwę/opis |
+| DELETE | /api/conversations/ | Usuń (owner) |
+| POST | /api/conversations//members | Dodaj członka |
+| DELETE | /api/conversations//members/ | Usuń członka |
+| PATCH | /api/conversations//settings | Mute/archive |
+
+### Wiadomości
+| Method | URL | Opis |
+|--------|-----|------|
+| GET | /api/conversations//messages | Paginacja cursor-based |
+| POST | /api/conversations//messages | Wyślij |
+| PATCH | /api/messages/ | Edytuj (swoje, max 24h) |
+| DELETE | /api/messages/ | Soft delete (swoje) |
+| POST | /api/messages//forward | Przekaż |
+| POST | /api/conversations//read | Oznacz przeczytane |
+| POST | /api/conversations//typing | Typing indicator |
+
+### Reakcje i przypięcia
+| Method | URL | Opis |
+|--------|-----|------|
+| POST | /api/messages//reactions | Dodaj |
+| DELETE | /api/messages//reactions/ | Usuń |
+| POST | /api/messages//pin | Przypnij |
+| DELETE | /api/messages//pin | Odepnij |
+| GET | /api/conversations//pins | Lista przypiętych |
+
+### Inne
+| Method | URL | Opis |
+|--------|-----|------|
+| GET | /api/messages/stream | SSE |
+| GET | /api/users/presence | Online status (batch) |
+| POST | /api/messages/upload | Upload pliku |
+
+## Frontend
+
+### Desktop
+- Lewy panel (380px): lista konwersacji posortowana po updated_at
+- Prawy panel: nagłówek (avatar, imię, status, typing) + wiadomości (bąbelki) + input (Quill)
+
+### Wiadomości
+- Bąbelki: moje (niebieskie, prawo) / cudze (szare, lewo)
+- Separatory dat
+- Reply-to: cytat nad odpowiedzią
+- Edytowane: etykieta "(edytowano)"
+- Usunięte: "Wiadomość usunięta"
+- Załączniki inline (obrazy jako podgląd, pliki jako pill)
+- Reakcje: pill badges pod bąbelkiem
+- Link preview: karta z tytułem + opisem
+- Read receipts 1:1: ptaszki (wysłano/doręczono/przeczytano), hover → timestampy
+- Read receipts grupa: awatary (max 4 + "+N")
+
+### Menu kontekstowe (hover/long-press)
+Odpowiedz, Reaguj (6 emoji), Przekaż, Przypnij, Edytuj, Usuń
+
+### Mobile (< 768px)
+Lista LUB chat (nie oba). Przycisk "Wróć". Menu kontekstowe jako bottom sheet.
+
+## Email notifications
+
+```
+if member.is_muted → nie wysyłaj
+elif not user.notify_email_messages → nie wysyłaj
+else → wysyłaj
+```
+
+Wyciszona konwersacja: ikona 🔇 na liście.
+
+## Link preview
+
+- Backend wykrywa URL, pobiera stronę (timeout 3s), parsuje og:title/og:description/og:image
+- Fallback: +
+- Tylko pierwszy URL, brak preview dla wewnętrznych linków
+- Zapisane w messages.link_preview (JSONB)
+
+## Migracja danych
+
+1. Prywatne wiadomości: grupowanie po parach sender/recipient → conversation (is_group=False)
+2. Grupy: message_group → conversation (is_group=True)
+3. Załączniki: nowy FK new_message_id
+4. Walidacja: count before = count after, read receipts zachowane
+5. Stare tabele zostają jako backup
+
+## Zależności infrastrukturalne
+
+- Redis na VM produkcyjnej (pub/sub + presence cache)
+- Nginx: SSE wymaga wyłączenia buforowania (`proxy_buffering off`) dla /api/messages/stream
diff --git a/docs/zabbix_setup.md b/docs/zabbix_setup.md
index 843d0b0..df7b193 100644
--- a/docs/zabbix_setup.md
+++ b/docs/zabbix_setup.md
@@ -1,12 +1,11 @@
-# Zabbix Monitoring Setup - NORDABIZ-01
+# Zabbix Monitoring Setup - OVH VPS (inpi-vps-waw01)
## Informacje o serwerze
| Parametr | Wartosc |
|----------|---------|
-| **Nazwa hosta** | NORDABIZ-01 |
-| **VM ID** | 249 |
-| **IP** | 10.22.68.249 |
+| **Nazwa hosta** | inpi-vps-waw01 |
+| **IP** | 57.128.200.27 |
| **OS** | Ubuntu 22.04 LTS |
| **Aplikacja** | Flask (NordaBiznes Partner) |
| **Baza danych** | PostgreSQL 15 (localhost:5432) |
@@ -29,7 +28,7 @@
Polacz sie z serwerem i sprawdz czy agent jest zainstalowany:
```bash
-ssh maciejpi@10.22.68.249
+ssh maciejpi@57.128.200.27
# Sprawdz status agenta (Zabbix Agent 2 - nowsza wersja)
systemctl status zabbix-agent2
@@ -100,7 +99,7 @@ Server=10.22.68.126
ServerActive=10.22.68.126
# Nazwa hosta - MUSI byc identyczna jak w Zabbix Server
-Hostname=NORDABIZ-01
+Hostname=inpi-vps-waw01
# Port nasluchiwania (domyslny)
ListenPort=10050
@@ -165,7 +164,7 @@ sudo nano /etc/zabbix/zabbix_agent2.d/nordabiznes.conf
```ini
# ============================================
# NordaBiznes Partner - Custom Zabbix Monitoring
-# Server: NORDABIZ-01 (10.22.68.249)
+# Server: OVH VPS inpi-vps-waw01 (57.128.200.27)
# ============================================
# --- FLASK APPLICATION ---
@@ -283,11 +282,11 @@ zabbix_agent2 -t nordabiznes.disk_usage_mb
| Pole | Wartosc |
|------|---------|
-| Host name | NORDABIZ-01 |
-| Visible name | NordaBiznes Partner (10.22.68.249) |
+| Host name | inpi-vps-waw01 |
+| Visible name | NordaBiznes Partner (57.128.200.27) |
| Templates | Linux by Zabbix agent, PostgreSQL by Zabbix agent 2 |
| Host groups | Linux servers, Web servers, Databases |
-| Interfaces | Agent: 10.22.68.249:10050 |
+| Interfaces | Agent: 57.128.200.27:10050 |
### 5.2 Utworzenie dedykowanego template'u
@@ -319,14 +318,14 @@ Utworz nowy template dla NordaBiznes:
| Name | Expression | Severity |
|------|------------|----------|
-| NordaBiznes app is down | last(/NORDABIZ-01/nordabiznes.health)=0 | High |
-| NordaBiznes service stopped | last(/NORDABIZ-01/nordabiznes.service_status)=0 | High |
-| PostgreSQL is down | last(/NORDABIZ-01/postgresql.status)=0 | Disaster |
-| High response time (>2s) | last(/NORDABIZ-01/nordabiznes.response_time)>2000 | Warning |
-| Low Gunicorn workers | last(/NORDABIZ-01/nordabiznes.workers)<2 | Warning |
-| High DB connections (>80) | last(/NORDABIZ-01/postgresql.connections)>80 | Warning |
-| High memory usage (>500MB) | last(/NORDABIZ-01/nordabiznes.memory_mb)>500 | Warning |
-| Disk usage >5GB | last(/NORDABIZ-01/nordabiznes.disk_usage_mb)>5120 | Warning |
+| NordaBiznes app is down | last(/inpi-vps-waw01/nordabiznes.health)=0 | High |
+| NordaBiznes service stopped | last(/inpi-vps-waw01/nordabiznes.service_status)=0 | High |
+| PostgreSQL is down | last(/inpi-vps-waw01/postgresql.status)=0 | Disaster |
+| High response time (>2s) | last(/inpi-vps-waw01/nordabiznes.response_time)>2000 | Warning |
+| Low Gunicorn workers | last(/inpi-vps-waw01/nordabiznes.workers)<2 | Warning |
+| High DB connections (>80) | last(/inpi-vps-waw01/postgresql.connections)>80 | Warning |
+| High memory usage (>500MB) | last(/inpi-vps-waw01/nordabiznes.memory_mb)>500 | Warning |
+| Disk usage >5GB | last(/inpi-vps-waw01/nordabiznes.disk_usage_mb)>5120 | Warning |
---
@@ -336,20 +335,20 @@ Utworz nowy template dla NordaBiznes:
```bash
# Na serwerze Zabbix (10.22.68.126)
-zabbix_get -s 10.22.68.249 -k agent.ping
+zabbix_get -s 57.128.200.27 -k agent.ping
# Oczekiwany wynik: 1
-zabbix_get -s 10.22.68.249 -k nordabiznes.health
+zabbix_get -s 57.128.200.27 -k nordabiznes.health
# Oczekiwany wynik: 1
-zabbix_get -s 10.22.68.249 -k postgresql.status
+zabbix_get -s 57.128.200.27 -k postgresql.status
# Oczekiwany wynik: 1
```
-### 6.2 Test lokalnie na NORDABIZ-01
+### 6.2 Test lokalnie na inpi-vps-waw01
```bash
-# Na serwerze NORDABIZ-01
+# Na serwerze inpi-vps-waw01
zabbix_agent2 -t agent.ping
zabbix_agent2 -t nordabiznes.health
zabbix_agent2 -t nordabiznes.service_status
@@ -384,7 +383,7 @@ Uzycie: `ssl.days_until_expiry[nordabiznes.pl]`
4. **Graph: Memory Usage** - nordabiznes.memory_mb (trend)
5. **Graph: DB Connections** - postgresql.connections (trend)
6. **Counter: Chat Messages Today** - nordabiznes.chat_messages_today
-7. **Top Hosts: Active Problems** - filtry dla NORDABIZ-01
+7. **Top Hosts: Active Problems** - filtry dla inpi-vps-waw01
---
diff --git a/mockups/messages_chat_view.html b/mockups/messages_chat_view.html
new file mode 100644
index 0000000..19850fc
--- /dev/null
+++ b/mockups/messages_chat_view.html
@@ -0,0 +1,827 @@
+
+
+
+
+
+NordaBiznes — Wiadomości (mockup konwersacyjny)
+
+
+
+
+
+
+
NordaBiznes
+
+
+
+
+
+
+
+
+
Wiadomości
+
+
+
+
+
+
+
+
+
+
+
+
MK
+
+
+ Magdalena Kloska
+ 11:54
+
+
+ witam, weszlam w skladki i mam pytanie...
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ Modul skladek7 os.
+ 24.03
+
+
+ Ty: Jest gotowa taka funkcjonalnosc dla roli kierownika...
+
+
+
+
+
+
+
AW
+
+
+ Artur Wiertel
+ 20.03
+
+
+ fajnie to wyglada.
+
+
+
+
+
+
+
RW
+
+
+ Roman Wiercinski
+ 18.03
+
+
+ Ty: Dzien dobry, przesylam podsumowanie...
+
+
+
+
+
+
+
LG
+
+
+ Leszek Glaza
+ 15.03
+
+
+ Ty: Lista firm z kontaktami gotowa.
+
+
+
+
+
+
+
+
+
+
+
+
+
MK
+
+
Magdalena Kloska
+
Kierownik Biura · Izba Norda Biznes
+
+
+
+
+
+
+
+
+
+
+
19 marca 2026
+
+
+
+
+
Skladki i NIP-y nowych czlonkow
+ Pani Magdaleno, importuje dane o skladkach z pliku Excel do systemu portalu. Wiekszosc firm dopasowala sie automatycznie, ale kilka nazw wymaga weryfikacji.
+
+ Prosze o sprawdzenie — czy te firmy maja profile na portalu pod inna nazwa?
+
+ EKOZUK, FRESH BIKE, JANTAR, MACIEJ HALAS, MARKISOL, N33, PGK, SKLEPY LORD, WW GLASS
+
+ 19:49
+
+
+
+
+
+
+
+
Kalendarz — wydarzenia zewnetrzne
+ Pani Magdo, dodalismy przed chwila tez informacje o wydarzeniach zewnetrznych. One w kalendarzu sa widoczne...
+
+ 12:06
+
+
+
+
+
+
+
+ z teog co widze na szybko i odnotowalam to firm ted jest w3pisana dwa razy ale nip ten sam tutaj...
+
13:30
+
+
+
+
+
+ Ok, pani Magdo, ogarne te tematy, jak tylko wroce do biura.
+
+ 13:54
+
+
+
+
+
+
25 marca 2026
+
+
+
+ dzien dobry do jutra wlacznie mam opieke ale staram sie ogrniac tematy ile sie da.
+
+ EKOZUK- EKOFABRYKA TO JEST TO SAMO
+
+ FRESH BIKE fresh bike oraz jantar- to jest podspolka da Eura Tech - te na niebiesko nie placa skladeek indywidualnych ale firma wchodzaca do Nordy moze wniesc kilka swoich spolek placac wieksza skladke.
+
+ MACIEJ HALAS- prosze ich nie uwzlgedniac - rezygnacja z czlonkostwa.
+
+ MARKISOL tak samo rezygnajca
+
+ N33 to tezs jest pod spolk awraz z Termo
+
+ PGK Pucka Gospodarka Komunalna Sp. z o.o. NIP: 587-02-00-062
+
+ SKLEPY LORD: Lord sp. z o.o. nip 5882533102
+
+ WW GLASS tak samo podspolka innej firmy glownje - tutaj lenap hale
+
11:47
+
+
+
+
+
+ witam, weszlam w skladki i mam pytanie jesli ktos np zaplaci zaleglosc lub kolejna rate jaqk to zmienic w systemie ?
+
11:54
+
+
+
+
27 marca 2026
+
+
+
+ Pani Magdaleno, informacje o firmach przyjete, wprowadzam poprawki w systemie.
+
+ Dwa pytania:
+
+ 1. N33 i Termo — pod jaka firme glowna wchodza?
+
+ 2. Potrzebuje NIP-y nowych czlonkow: Audioline, Coach 4 You, Digital Technik, Ekonsult, GoodWill, IBET, Prospoland, Steamset.
+
+ Co do skladek — panel Administracja, Skladki, przy danym miesiacu "Oznacz jako oplacone". Mozna wpisac kwote i date wplaty.
+