# PSI - Polska Strefa Inwestycji System informacyjny dla inwestorów zawierający bazę 2731 gmin objętych Polską Strefą Inwestycji wraz z informacjami o intensywności pomocy publicznej, minimalnych nakładach inwestycyjnych i różnicach dla różnych wielkości firm. **SEO & Discoverability:** - Sitemap XML: /sitemap.xml (zawiera 4000+ dynamicznych stron gmin) - Robots.txt: /robots.txt (z obsługą AI crawlerów) - Human credits: /humans.txt ## About Aplikacja webowa umożliwiająca przedsiębiorcom i inwestorom: - Wyszukiwanie gmin w Polsce objętych systemem PSI - Sprawdzanie poziomu wsparcia publicznego (0-70% kosztów kwalifikowanych) - Kalkulację minimalnych nakładów inwestycyjnych w zależności od wielkości firmy (duża, średnia, mała, mikro) - Obliczanie ulgi podatkowej w ramach PSI - Dostęp do informacji o kryteriach i regulacjach programu ## Key Features - **Baza 2731 gmin** - kompletna baza wszystkich gmin w Polsce z informacjami o PSI - **Cascading dropdowns** - dynamiczne filtrowanie: województwo → powiat → gmina - **AJAX loading** - wydajne ładowanie danych bez przeładowania strony - **Kalkulator PSI** - zaawansowany kalkulator ulgi podatkowej z uwzględnieniem: - Wielkości firmy (mikro/mała/średnia/duża) - Typu zakładu (nowy vs istniejący) - Wartości inwestycji - Sektora działalności (BPO/SSE) - Rodzaju kosztów (środki trwałe, koszty pracy, wynajem) - **Rozwijane szczegóły** - szczegółowe informacje dla każdej gminy i typu firmy - **Artykuły informacyjne** - baza wiedzy o PSI z edytorem TinyMCE - **Formularz kontaktowy** - komunikacja z administratorem - **SEO-friendly** - sitemaps, robots.txt, meta tagi - **Responsywny design** - dostosowany do urządzeń mobilnych ## Tech Stack **Backend:** - Django 5.2.7 (Python 3.14.0) - SQLite (2731 rekordów gmin) - Gunicorn (production server) **Frontend:** - HTML5, CSS3 - JavaScript (Vanilla - bez frameworków) - AJAX dla dynamicznych dropdowns **Dependencies:** - django-tinymce - edytor WYSIWYG dla artykułów - pandas, openpyxl - import danych z Excela - django-debug-toolbar - narzędzia developerskie **Deployment:** - Nginx (reverse proxy) - Systemd (ulga.service) - VPS deployment ready ## Structure ``` ulga/ ├── psi/ # Główna aplikacja Django (settings, urls, wsgi) ├── website/ # Aplikacja funkcjonalna │ ├── models.py # Modele: Gmina, Artykul, Kontakt │ ├── views.py # Widoki i API endpoints │ ├── calculators.py # Logika kalkulatora PSI │ ├── forms.py # Formularze (KalkulatorPSIForm, KontaktForm) │ ├── services.py # Serwisy (email) │ ├── sitemaps.py # SEO - sitemap │ ├── templates/ # Szablony HTML │ ├── static/ # CSS, JS, images │ └── management/ # Komendy Django │ └── commands/ │ ├── import_gminy.py # Import gmin z Excel │ └── update_minimalne_naklady.py # Aktualizacja nakładów ├── deploy/ # Konfiguracja deploymentu │ ├── gunicorn_config.py │ ├── nginx.conf │ ├── ulga.service │ └── update.sh ├── db.sqlite3 # Baza danych ├── requirements.txt # Zależności Python └── manage.py # Django CLI ``` ## API ### REST Endpoints **GET /api/powiaty/** - Parametry: `wojewodztwo={nazwa}` - Zwraca: Lista powiatów w województwie (JSON) **GET /api/gminy/** - Parametry: - `wojewodztwo={nazwa}` (opcjonalnie) - `powiat={nazwa}` (opcjonalnie) - `search={query}` (opcjonalnie) - Zwraca: Lista gmin z pełnymi danymi (JSON) Przykładowa odpowiedź: ```json { "gminy": [ { "id": 123, "nazwa": "Warszawa", "powiat": "m.st. Warszawa", "wojewodztwo": "mazowieckie", "intensywnosc_pomocy": "0.00", "minimalne_naklady": "0.00", "intensywnosci": { "duza": {...}, "srednia": {...}, "mala": {...}, "mikro": {...} } } ] } ``` ## Documentation - **Deployment:** [deploy/DEPLOYMENT_GUIDE.md](deploy/DEPLOYMENT_GUIDE.md) - **SEO:** [SEO_INSTRUKCJA.md](SEO_INSTRUKCJA.md) - **Konfiguracja kontaktu:** [KONFIGURACJA_KONTAKT.md](KONFIGURACJA_KONTAKT.md) - **VPS Setup:** [vps_setup_guide.md](vps_setup_guide.md) - **README:** [README.md](README.md) ## Context for AI ### Naming Conventions - **Modele:** PascalCase (`Gmina`, `Artykul`, `Kontakt`) - **Pola modeli:** snake_case (`kod_teryt`, `intensywnosc_pomocy`, `minimalne_naklady`) - **Widoki:** snake_case functions (`gminy_list`, `kalkulator_psi`, `api_get_powiaty`) - **URL names:** snake_case (`gminy_list`, `artykul_detail`, `api_get_gminy`) - **Templates:** snake_case (`gminy_list.html`, `artykul_detail.html`) - **CSS/JS:** snake_case z kropkami (`gminy_list.js`, `kalkulator_psi.css`) ### Main Data Models **Gmina** (core model): - `kod_teryt` (CharField, unique) - Kod TERYT gminy - `nazwa` (CharField) - Nazwa gminy - `rodzaj` (CharField) - GW/GM/GMW/MNP (wiejska/miejska/miejsko-wiejska/miasto na prawach powiatu) - `powiat` (CharField) - Powiat - `wojewodztwo` (CharField) - Województwo - `strefa_ekonomiczna` (CharField, nullable) - SSE - `intensywnosc_pomocy` (DecimalField) - Intensywność pomocy % (0-70) - `minimalne_naklady` (DecimalField) - Minimalne nakłady PLN - `stopa_bezrobocia` (DecimalField) - Stopa bezrobocia % - `gmina_tracaca` (BooleanField) - Czy traci funkcje społeczno-gospodarcze **Artykul**: - `tytul`, `slug`, `tresc` (HTMLField), `data_publikacji`, `widoczny` **Kontakt**: - `imie`, `email`, `telefon`, `temat`, `wiadomosc`, `data_wyslania` ### Key Endpoints/Views **Public Pages:** - `/` - home (landing page) - `/gminy/` - gminy_list (główna funkcjonalność - baza gmin) - `/gminy//` - **gmina_detail (4000+ dynamicznych stron - po jednej dla każdej gminy)** - `/kalkulator-psi/` - kalkulator_psi (kalkulator ulgi) - `/o-programie/` - o_programie (info o PSI) - `/kryteria-ilosciowe/` - kryteria_ilosciowe - `/kryteria-jakosciowe/` - kryteria_jakosciowe - `/artykuly/` - artykuly_list - `/artykuly//` - artykul_detail - `/kontakt/` - kontakt (formularz kontaktowy) - `/polityka-prywatnosci/` - polityka_prywatnosci - `/regulamin/` - regulamin - `/uslugi-doradcze/` - uslugi_doradcze **API Endpoints:** - `/api/powiaty/` - api_get_powiaty (AJAX - lista powiatów) - `/api/gminy/` - api_get_gminy (AJAX - lista gmin) **SEO:** - `/sitemap.xml` - Django sitemaps (static, artykuly, **gminy - 4000+ URLs**) - `/robots.txt` - views_robots.py (wsparcie dla AI crawlerów: GPTBot, Claude-Web, Google-Extended, CCBot) - `/humans.txt` - credits for humans - `/llms.txt` - this file (AI/LLM context) ### Calculator Logic (PSICalculator) Główna klasa: `website/calculators.py::PSICalculator` **Przeliczniki:** - Minimalne nakłady dla wielkości firm: - Duża: 100% bazowej wartości (1.0) - Średnia: 10% (0.1) - Mała: 5% (0.05) - Mikro: 2% (0.02) - Bonusy intensywności: - Duża: +0pp - Średnia: +10pp - Mała: +20pp - Mikro: +20pp - Istniejący zakład: 50% progu minimalnych nakładów **Specjalne przypadki:** - Warszawa: 0% intensywności (brak wsparcia PSI) - Gminy tracące funkcje: 10 mln PLN minimalnych nakładów (581 gmin) - Granica wschodnia: 10 mln PLN (197 gmin w 12 powiatach) ### Important Business Rules 1. **Nowy zakład** wymaga 100% minimalnych nakładów 2. **Istniejący zakład** wymaga 50% minimalnych nakładów 3. Intensywność pomocy zależy od: - Lokalizacji (gmina) - Wielkości firmy (mikro/mała/średnia/duża) - Rozmiaru projektu (mały <55M EUR, średni 55-110M EUR, bardzo duży >110M EUR) 4. Koszty kwalifikowane: środki trwałe, koszty pracy (2 lata), wynajem nieruchomości (3 lata) ### Management Commands - `python manage.py import_gminy` - Import gmin z pliku Excel - `python manage.py update_minimalne_naklady` - Aktualizacja minimalnych nakładów ### Polish Locale Projekt używa polskiego sortowania (`locale.setlocale(locale.LC_COLLATE, 'pl_PL')`) dla prawidłowego sortowania nazw z polskimi znakami (ą, ć, ę, ł, ń, ó, ś, ź, ż). Fallback dostępny w views.py. ## Contact **Website:** ulga-psi.pl **Admin Panel:** /admin/ **Contact Form:** /kontakt/ --- *Plik wygenerowany dla kontekstu AI/LLM - zawiera strukturalne i funkcjonalne informacje o projekcie PSI.*