nordabiz/docs/ROADMAP.md
Maciej Pienczyn e14d95394d feat(announcements): System ogłoszeń i aktualności dla członków
- Model Announcement z kategoriami, statusami, slugami URL
- Panel admina /admin/announcements (CRUD, filtry, AJAX)
- Strona /ogloszenia tylko dla zalogowanych członków
- Szczegóły ogłoszenia /ogloszenia/<slug>
- Migracja SQL rozszerzająca istniejącą tabelę
- Testowe ogłoszenia: ARP baza noclegowa, Tytani Przedsiębiorczości
- Pliki PDF regulaminu i harmonogramu konkursu Tytani

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 22:10:54 +01:00

15 KiB

NordaBiz - Plan rozwoju i monetyzacja

Ten dokument zawiera plany rozwoju projektu i strategię monetyzacji. Główne instrukcje znajdują się w CLAUDE.md.


Status wdrożonych funkcjonalności

Funkcjonalność Status Data
Social Media Audit Wdrożone 2026-01-09
News Monitoring Wdrożone 2025-12-29
Katalog firm Wdrożone 2025-11-23
Chat AI (NordaGPT) Wdrożone 2025-11-23

Priorytet 1: Social Media Integration (Posts/Events)

Status: Planowane Cel: Pobieranie postów i wydarzeń z Social Media firm

Źródła danych

  • Facebook Pages firm członkowskich (posty, wydarzenia)
  • LinkedIn Company Pages
  • Google My Business (recenzje, posty)

Wymagania techniczne

  • Facebook Graph API (wymaga App Review dla pages_read_engagement)
  • LinkedIn Marketing API (wymaga partnera lub OAuth)
  • Google Business Profile API

Typy zdarzeń do importu

  • social_post - posty z social media
  • social_event - wydarzenia z Facebooka
  • review - nowe recenzje Google

Priorytet 2: News Monitoring (Google/Brave API)

Status: Wdrożone (2025-12-29)

Źródła danych

  • Wzmianki o firmach w mediach lokalnych/branżowych
  • Artykuły prasowe
  • Komunikaty branżowe

Typy zdarzeń

  • news_mention - wzmianka w mediach
  • press_release - komunikat prasowy
  • award - nagroda/wyróżnienie

Priorytet 3: Zarząd i Wspólnicy (rejestr.io)

Status: Planowane Cel: Wyświetlanie osób powiązanych z firmą bezpośrednio na stronie profilu

Dane do pobrania z rejestr.io

  • Zarząd (Prezes, Wiceprezes, Członkowie Zarządu)
  • Prokurenci
  • Wspólnicy z % udziałów
  • Beneficjenci rzeczywiści
  • Linki do profili osób (powiązania z innymi firmami)

Wymagania techniczne

  • Tabela company_people (company_id, name, role, shares_percent, person_url)
  • Scraper Playwright (już mamy bazę w analyze_connections.py)
  • Sekcja w company_detail.html po "Informacje prawne i biznesowe"

Przykład wyświetlania

👥 ZARZĄD I WSPÓLNICY
┌─────────────────────────────────────────┐
│ 👔 Jan Kowalski - Prezes Zarządu        │
│ 👔 Anna Nowak - Członek Zarządu         │
│ 💼 Firma XYZ Sp. z o.o. - 60% udziałów  │
│ 💼 Jan Kowalski - 40% udziałów          │
└─────────────────────────────────────────┘

Korzyści

  • Widoczne powiązania między firmami Norda Biznes
  • Ułatwiony networking (kto zna kogo)
  • Transparentność struktury właścicielskiej

Priorytet 4: System rekomendacji i zdjęć

Status: Planowane Cel: Umożliwienie firmom członkowskim wzajemnego polecania się oraz prezentacji zdjęć

Funkcje

  • Rekomendacje między firmami (kto poleca kogo)
  • Galeria zdjęć firmy (realizacje, zespół, biuro)
  • Wyświetlanie na profilu firmy

Priorytet 5: Status członkostwa i płatności

Status: Planowane Cel: Śledzenie statusu członkostwa i składek miesięcznych

Funkcje

  • Status członka (aktywny, zawieszony, były członek)
  • Informacja o opłaconych składkach
  • Historia płatności
  • Przypomnienia o zaległościach (dla admina)

Priorytet 6: System powiadomień

Status: Planowane Cel: Powiadamianie użytkowników o istotnych zdarzeniach bez konieczności logowania Źródło: Feedback od członków Norda Biznes (Janusz Masiak, Angelika Piechocka) - 2026-01-22

Kanały powiadomień

Kanał Zastosowanie Technologia Koszt
Email Standardowe powiadomienia SendGrid / Mailgun / SMTP ~$15/mies (10k maili)
SMS Pilne/ważne powiadomienia SMSAPI.pl ~0.07 zł/SMS
Push Natychmiastowe (PWA) Web Push API Darmowe

Typy powiadomień

Typ Email SMS Push Domyślnie
Nowe wydarzenia Norda Biznes Email+Push
Nowe aktualności i newsy Email
Wiadomości od innych firm Email+Push
Przypomnienia o spotkaniach Wszystkie
Newsletter tygodniowy Wyłączone

Legenda: dostępne domyślnie, dostępne opcjonalnie, niedostępne

Panel preferencji powiadomień

Użytkownik w profilu będzie mógł:

  • Włączyć/wyłączyć poszczególne typy powiadomień
  • Wybrać preferowane kanały (email, SMS, push)
  • Ustawić "ciche godziny" (np. brak SMS po 21:00)
  • Zapisać numer telefonu do SMS

Wymagania techniczne

# Nowa tabela: notification_preferences
class NotificationPreference(Base):
    __tablename__ = 'notification_preferences'

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'), unique=True)

    # Kanały
    email_enabled = Column(Boolean, default=True)
    sms_enabled = Column(Boolean, default=False)
    push_enabled = Column(Boolean, default=True)
    phone_number = Column(String(15))  # Format: +48XXXXXXXXX

    # Typy powiadomień
    events_email = Column(Boolean, default=True)
    events_sms = Column(Boolean, default=False)
    news_email = Column(Boolean, default=True)
    messages_email = Column(Boolean, default=True)
    messages_push = Column(Boolean, default=True)
    reminders_sms = Column(Boolean, default=True)
    newsletter = Column(Boolean, default=False)

    # Ciche godziny
    quiet_hours_start = Column(Time)  # np. 21:00
    quiet_hours_end = Column(Time)    # np. 08:00

# Nowa tabela: notification_log (audit)
class NotificationLog(Base):
    __tablename__ = 'notification_log'

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    channel = Column(String(10))  # email, sms, push
    type = Column(String(30))     # event, news, message, reminder
    subject = Column(String(200))
    sent_at = Column(DateTime, default=datetime.utcnow)
    status = Column(String(20))   # sent, failed, bounced

Integracje

  • Email: Flask-Mail + SendGrid API (fallback: SMTP)
  • SMS: SMSAPI.pl (polska firma, dobra dokumentacja)
  • Push: Web Push API + pywebpush (wymaga PWA - Priorytet 7)

Priorytet 7: PWA (Progressive Web App)

Status: Planowane Cel: Umożliwienie "instalacji" NordaBiznes na telefonie jako aplikacji Źródło: Feedback od Angeliki Piechockiej - 2026-01-22

Korzyści PWA vs natywna aplikacja

Aspekt PWA Natywna aplikacja
Koszt rozwoju Niski Wysoki (iOS + Android)
Czas wdrożenia 2-4 tygodnie 3-6 miesięcy
Aktualizacje Natychmiastowe Wymaga publikacji w Store
Instalacja "Dodaj do ekranu" App Store / Google Play
Push notifications (Android, iOS 16.4+)
Dostęp offline Ograniczony Pełny
Kamera/GPS

Wymagania techniczne

  1. manifest.json - metadane aplikacji (nazwa, ikony, kolory)
  2. Service Worker - cache, offline, push notifications
  3. HTTPS - już mamy (Let's Encrypt)
  4. Ikony - różne rozmiary (192x192, 512x512)

Przykład manifest.json

{
  "name": "NordaBiznes - Katalog Firm",
  "short_name": "NordaBiznes",
  "description": "Platforma networkingowa członków Norda Biznes",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#1a1a2e",
  "theme_color": "#6c5ce7",
  "icons": [
    {
      "src": "/static/icons/icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/static/icons/icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

Fazy wdrożenia

  1. Faza 1: Podstawowy PWA (manifest + service worker cache)
  2. Faza 2: Push notifications (integracja z Priorytetem 6)
  3. Faza 3: Offline mode (cache kluczowych stron)

Zależności

  • Push notifications w PWA wymagają Service Worker
  • Priorytet 6 (System powiadomień) i Priorytet 7 (PWA) są powiązane
  • Rekomendacja: wdrażać równolegle

Priorytet 8: System ogłoszeń i aktualności

Status: Planowane Cel: Umożliwienie komunikacji z członkami Norda Biznes - ogłoszenia, aktualności, ważne informacje Źródło: Potrzeba rozesłania informacji o bazie noclegowej ARP dla elektrowni jądrowej - 2026-01-26

Problem

Obecnie brak możliwości:

  • Publikowania ogłoszeń dla członków na stronie www
  • Wysyłania masowych komunikatów do wszystkich członków
  • Targetowania komunikatów (np. tylko branża noclegowa)

Funkcjonalności

Panel admina (/admin/announcements)

  • Tworzenie nowych ogłoszeń (tytuł, treść, obrazek, link)
  • Ustawianie daty publikacji i wygaśnięcia
  • Wybór grupy docelowej (wszyscy / wybrane kategorie firm)
  • Podgląd przed publikacją
  • Historia wysłanych ogłoszeń

Strona publiczna (/aktualnosci)

  • Lista aktualnych ogłoszeń
  • Archiwum starszych ogłoszeń
  • Filtrowanie po kategorii
  • RSS feed (opcjonalnie)

Integracja z powiadomieniami (Priorytet 6)

  • Automatyczne wysyłanie email do członków przy nowym ogłoszeniu
  • Push notification (PWA)
  • Opcja "wyślij teraz" vs "tylko opublikuj na stronie"

Wymagania techniczne

# Nowa tabela: announcements
class Announcement(Base):
    __tablename__ = 'announcements'

    id = Column(Integer, primary_key=True)
    title = Column(String(200), nullable=False)
    slug = Column(String(200), unique=True)
    content = Column(Text, nullable=False)  # Markdown lub HTML
    excerpt = Column(String(500))  # Krótki opis do listy
    image_url = Column(String(500))
    external_link = Column(String(500))  # Link do zewnętrznego źródła

    # Publikacja
    status = Column(String(20), default='draft')  # draft, published, archived
    published_at = Column(DateTime)
    expires_at = Column(DateTime)  # Opcjonalna data wygaśnięcia

    # Targetowanie
    target_audience = Column(String(50), default='all')  # all, category:IT, category:Services

    # Powiadomienia
    send_email = Column(Boolean, default=True)
    send_push = Column(Boolean, default=True)
    notification_sent_at = Column(DateTime)

    # Meta
    created_by = Column(Integer, ForeignKey('users.id'))
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, onupdate=datetime.utcnow)
    view_count = Column(Integer, default=0)

# Tabela śledzenia kto widział ogłoszenie
class AnnouncementView(Base):
    __tablename__ = 'announcement_views'

    id = Column(Integer, primary_key=True)
    announcement_id = Column(Integer, ForeignKey('announcements.id'))
    user_id = Column(Integer, ForeignKey('users.id'))
    viewed_at = Column(DateTime, default=datetime.utcnow)

Przykłady użycia

Scenariusz Target Email Push
Baza noclegowa ARP (elektrownia) Wszystkie firmy
Szkolenie IT category:IT
Spotkanie networkingowe Wszystkie firmy
Aktualizacja regulaminu Wszystkie firmy

Zależności

  • Priorytet 6 (Powiadomienia) - do wysyłania email/push
  • Priorytet 7 (PWA) - do push notifications
  • Może działać samodzielnie (tylko strona www) bez powiadomień

Fazy wdrożenia

  1. Faza 1: Strona /aktualnosci + panel admina (bez powiadomień)
  2. Faza 2: Integracja z email (gdy Priorytet 6 gotowy)
  3. Faza 3: Push notifications (gdy Priorytet 7 gotowy)

Notatki implementacyjne

  • Scraper powinien deduplikować wydarzenia (hash tytułu + daty)
  • Moderacja: nowe wydarzenia jako "pending" do zatwierdzenia przez admina
  • Rate limiting: max 100 requestów/dzień do zewnętrznych API

Forma prawna Norda Biznes

Stan obecny

  • Forma: OPP (Organizacja Pożytku Publicznego)
  • Typ: Stowarzyszenie non-profit

Planowana transformacja

  • Docelowa forma: Działalność gospodarcza (przy Izbie)
  • Cel: Możliwość pozyskiwania dofinansowań (granty, projekty UE)
  • Korzyści:
    • Dostęp do funduszy na rozwój platformy
    • Możliwość świadczenia płatnych usług
    • Elastyczność finansowa

Strategia monetyzacji

Model 3-tier Pricing (Kotwiczenie ceny)

Strategia: Trzy poziomy cenowe z zastosowaniem psychologii kotwiczenia ceny (Price Anchoring). Najwyższy poziom służy jako kotwica - sprawia że środkowy wydaje się atrakcyjny i jest docelowy.

Poziom Nazwa Cena/mies. Cel strategiczny
1 Basic ~49 zł Entry point, ograniczone funkcje
2 Premium ~99 zł DOCELOWY - rekomendowany, najlepsza wartość
3 Enterprise ~199 zł KOTWICA - premium, pełny dostęp

Wyjątek: Członkowie Izby NORDA płacący składki (~200 zł/mies.) mają specjalny status - dostęp Premium za symboliczne 1 zł.

Psychologia 3-tier Pricing

  • Ludzie naturalnie wybierają środkową opcję (efekt kompromisu)
  • Wysoka cena kotwicy sprawia że środkowa wydaje się "okazją"
  • Niska cena Basic sprawia że użytkownik czuje "upgrade jest wart dopłaty"
  • Firmy stosujące 3-tier widzą ~30% wzrost przychodów
  • Slack: dodanie Enterprise tier zwiększyło konwersję na Professional o 28%

Matryca dostępu do funkcji

Funkcja Basic Premium Enterprise
Katalog firm
Profil firmy
Forum
Kalendarz wydarzeń
Chat AI (NordaGPT)
Powiadomienia email
Powiadomienia SMS
Powiadomienia push (PWA)
Aktualności i ogłoszenia
Raporty podstawowe
Raporty zaawansowane
Eksport danych (CSV/PDF)
API dostęp
Priorytetowe wsparcie

Implementacja techniczna (przyszłość)

# Model User - nowe pola
class User(Base):
    # ...
    subscription_tier = Column(String(20), default='basic')  # basic, premium, enterprise
    subscription_expires_at = Column(DateTime)
    is_norda_member = Column(Boolean, default=False)  # Członek Izby = specjalny status

# Dekorator kontroli dostępu
def requires_tier(min_tier):
    def decorator(f):
        @wraps(f)
        def wrapped(*args, **kwargs):
            tiers = ['basic', 'premium', 'enterprise']
            user_tier_idx = tiers.index(current_user.subscription_tier)
            required_idx = tiers.index(min_tier)
            if user_tier_idx < required_idx:
                flash(f'Ta funkcja wymaga konta {min_tier.title()}.', 'warning')
                return redirect(url_for('pricing'))
            return f(*args, **kwargs)
        return wrapped
    return decorator

# Użycie
@app.route('/raporty/zaawansowane')
@login_required
@requires_tier('enterprise')
def advanced_reports():
    ...

Raporty - podział według poziomu

Raporty podstawowe (Premium+):

  • Staż członkostwa w Izbie NORDA
  • Pokrycie Social Media
  • Struktura branżowa

Raporty zaawansowane (Enterprise only):

  • Ranking SEO
  • Mapa lokalizacji
  • Sieć rekomendacji
  • Aktywność w wydarzeniach