# Historia zmian – PDF Konwenter

Format zgodny z [Keep a Changelog](https://keepachangelog.com/pl/), wersjonowanie [SemVer](https://semver.org/lang/pl/):
**MAJOR** – zmiany niekompatybilne (np. schemat bazy wymagający migracji danych),
**MINOR** – nowe funkcje, **PATCH** – poprawki.
Każda modyfikacja aplikacji = podbicie `version` w `config/app.php` + wpis poniżej
(+ ewentualna migracja w `database/migrations/<wersja>.sql`).

## [1.7.2] – 2026-10-07
### Dodano
- Panel administratora → Ustawienia → **Nazwa aplikacji** – zmiana nazwy wyświetlanej na stronie logowania, w pasku aplikacji,
  tytułach kart, stopce i eksportach (domyślnie z `config/app.php`). Znaczniki HTML i znaki sterujące są usuwane.

## [1.7.1] – 2026-10-06
### Naprawiono (na podstawie dziennika błędów z serwera)
- **OCR serwerowy (OCRmyPDF)** kończył się błędem `read_params_file: Can't open hocr`: katalog dokładnych modeli `tessdata_best` nie zawierał
  konfiguracji Tesseracta. Instalator kopiuje je teraz do `/usr/local/share/tessdata_best`; bez nich aplikacja automatycznie używa modeli systemowych
  (OCR działa zawsze).
- **Worker audio: „MySQL server has gone away”** – po dłuższej bezczynności lub restarcie bazy połączenie wygasało. Warstwa bazy
  automatycznie łączy się ponownie (poza transakcją, bez ryzyka częściowego zapisu).
- **Konwersja Office → PDF: „source file could not be loaded”** – rozpoznawanie faktycznego formatu pliku (np. `.doc` zapisany jako RTF, HTML
  lub DOCX) i ponowna próba. Czytelne komunikaty dla plików uszkodzonych i zabezpieczonych hasłem.

## [1.7.0] – 2026-10-06
### Dodano – limity i przechowywanie dokumentów
- Panel administratora → Ustawienia → **Limity i przechowywanie dokumentów**:
  - automatyczne przenoszenie nieużywanych dokumentów do kosza po N dniach (od ostatniego użycia, zmiany lub utworzenia);
  - trwałe usuwanie z kosza po M dniach;
  - limit liczby wersji;
  - **limit miejsca na użytkownika**;
  - ostrzeżenia przed usunięciem;
  - czyszczenie plików tymczasowych i historii operacji.
- **Podgląd** i **Uruchom teraz** w panelu, stan magazynu, ostatni przebieg; CRON `bin/retention.php` codziennie o 03:15.
- **Kosz pracownika** (Moje dokumenty → Kosz): przywracanie i trwałe usuwanie własnych dokumentów, termin usunięcia, powód.
- Moje dokumenty: informacja o zasadach przechowywania, **wykorzystanie limitu miejsca**, ostrzeżenie „do kosza za X dni”.
- Administracja → Dokumenty: **ochrona dokumentu** przed automatycznym usuwaniem, oznaczenie dokumentów przeniesionych automatycznie.
- Zabezpieczenie: po włączeniu lub skróceniu okresu przechowywania liczy się on od dnia zmiany (brak nagłego usunięcia starych dokumentów).
- Baza danych: kolumny `documents.last_accessed_at`, `retention_hold`, `deleted_reason` (migracja `1.7.0.sql`).
### Zmieniono
- Otwarcie lub pobranie dokumentu zapisuje datę ostatniego użycia (bez zmiany daty modyfikacji).
- Przywrócenie dokumentu z kosza liczy okres przechowywania od nowa.

## [1.6.0] – 2026-10-04
### Dodano – moduł Audio AI (transkrypcja mowy)
- **Transkrypcja nagrań** WAV, MP3, M4A, AAC, OGG/Opus, FLAC, WEBM, WMA oraz nagrywanie z mikrofonu w przeglądarce.
  - Silniki: **OpenAI Whisper** (faster-whisper, domyślnie large-v3-turbo) i **Vosk** (lekki). Wybór w panelu administratora.
  - Język polski i angielski z automatycznym wykrywaniem; słownik nazw własnych (podpowiedź dla Whisper).
- **Rozpoznawanie mówców:**
  - silniki: sherpa-onnx (segmentacja pyannote 3.0 ONNX + odcisk głosu, bez tokenu) albo **pyannote.audio** (opcjonalnie);
  - weryfikacja klastrów odciskami głosu, wyrównanie granic wypowiedzi do końców zdań;
  - edycja: nazwy, kolory, scalanie, przypisywanie wypowiedzi;
  - oś czasu z udziałem każdego mówcy w rozmowie.
- **Redukcja szumów:**
  - filtr FFT (FFmpeg afftdn);
  - **RNNoise** (sieć neuronowa, 4 modele);
  - **Demucs** (separacja głosu od muzyki i hałasu);
  - filtr ciszy Silero VAD i normalizacja głośności.
- **Streszczenia AI i skróty spotkań** (temat, uczestnicy, ustalenia, zadania z terminami):
  - lokalny model językowy przez **Ollama**, domyślnie polski **Bielik**;
  - długie nagrania przetwarzane metodą map-reduce;
  - ochrona przed zapętleniem modelu;
  - edycja treści, własne polecenia (prompty), wybór języka streszczeń.
- **Podgląd transkrypcji:**
  - odtwarzacz z podświetlaniem bieżącego słowa, śledzeniem tekstu i prędkością odtwarzania;
  - wyszukiwanie z nawigacją, podkreślanie słów rozpoznanych z niską pewnością;
  - edycja tekstu dwuklikiem, skróty klawiszowe.
- **Eksport:** TXT, PDF, Word (DOCX), napisy SRT i WebVTT (opcjonalnie ze streszczeniem); zapis PDF w „Moich dokumentach”.
- **Kolejka zadań:**
  - statusy pending / processing / done / error / cancelled, postęp na żywo, pozycja w kolejce;
  - anulowanie zadania, ponawianie, priorytety;
  - automatyczna naprawa zadań przerwanych awarią.
- **Panel administratora → Transkrypcja audio:**
  - ustawienia silników, stan środowiska i modeli;
  - pobieranie modeli AI i modelu LLM, test LLM;
  - kolejka zadań z dziennikami, dziennik workera;
  - nagrania wszystkich użytkowników.
- Transkrypcje w **wyszukiwarce globalnej** (link otwiera nagranie w miejscu wypowiedzi).
- **Retencja plików audio** (RODO): automatyczne usuwanie nagrań po N dniach z zachowaniem transkrypcji.
- **Uprawnienia:** `audio.transcribe`, `audio.summarize`, `admin.audio` (rola Pracownik: transkrypcja i streszczenia).
- **Baza danych:** tabele `audio_files`, `audio_jobs`, `audio_transcriptions`, `audio_speakers`, `audio_segments`,
  `audio_summaries` (migracja `database/migrations/1.6.0.sql`).
- **Instalator:**
  - FFmpeg, środowisko `.venv-audio`, Ollama z modelem dobranym do RAM;
  - pobranie modeli, usługa systemd `pdf-konwenter-audio`;
  - parametry `AUDIO_ENABLE`, `WHISPER_MODEL`, `AUDIO_TORCH`, `OLLAMA_INSTALL`, `OLLAMA_MODEL`.
### Zmieniono
- Nagłówki bezpieczeństwa: zezwolenie na mikrofon (`Permissions-Policy`) i odtwarzanie `blob:` (`media-src`) dla nagrywania i podglądu.

## [1.5.2] – 2026-10-04
### Naprawiono
- Instalator, `SSL_MODE=custom`: podanie plików leżących już w `/etc/ssl/pdf-konwenter/` nie przerywa instalacji
  (wcześniej błąd `install: … are the same file`).
### Dodano
- Instalator sprawdza certyfikat przed podmianą: format PEM, klucz bez hasła, zgodność certyfikatu z kluczem,
  ważność (błąd, gdy wygasł; ostrzeżenie, gdy zostało mniej niż 30 dni).
- Ostrzeżenie o certyfikacie samopodpisanym pojawia się tylko wtedy, gdy na serwerze faktycznie jest taki certyfikat.

## [1.5.1] – 2026-10-04
### Zmieniono
- Nazwa aplikacji: **PDF Konwenter KPUW** (strona logowania, pasek aplikacji, tytuły kart, stopka, metadane plików).
- Strona logowania: etykieta pola loginu „Logowanie domenowe”.

## [1.5.0] – 2026-10-04
### Dodano
- **Integracja z Active Directory** (Panel administratora → Active Directory, uprawnienie `admin.ad`):
  - logowanie kontami domenowymi (login, `DOMENA\login`, UPN); **hasło weryfikuje kontroler domeny** przy każdym
    logowaniu – aplikacja nie przechowuje haseł AD, więc zmiana hasła w Windows obowiązuje od razu; czytelne komunikaty
    dla hasła wygasłego, konta zablokowanego/wyłączonego/wygasłego, wymaganej zmiany hasła,
  - **synchronizacja kont** (CRON `bin/ad-sync.php`, interwał z ustawień; także ręcznie i przy logowaniu): zakładanie,
    aktualizacja imienia i nazwiska, e-maila, loginu i roli, dezaktywacja kont wyłączonych / wygasłych / usuniętych w AD
    (dokumenty zostają); powiązanie po objectGUID; ochrona przed masową dezaktywacją przy błędnej konfiguracji,
  - grupa dostępowa i **mapowanie grup AD → role** (z obsługą grup zagnieżdżonych), rola domyślna,
  - LDAPS / StartTLS z weryfikacją certyfikatu (opcjonalnie własny CA), kilka kontrolerów domeny z przełączaniem,
  - hasło konta serwisowego szyfrowane AES-256-GCM (`storage/keys/app.key`),
  - test połączenia, test logowania użytkownika (rola i dostęp), podgląd zmian synchronizacji, historia synchronizacji,
  - lokalna blokada konta AD w aplikacji (niezależna od AD), konta lokalne działają nadal (konto awaryjne).
- Lista użytkowników: źródło konta (lokalne / AD), stan w AD, filtr; formularz i profil kont AD (dane z domeny tylko do odczytu).
- Migracja bazy `database/migrations/1.5.0.sql`; instalator Debiana instaluje `php-ldap` i dodaje zadanie CRON.

### Naprawiono
- `bin/migrate.php` nie wyświetlał numeru wersji migracji (znak „…” po nazwie zmiennej w łańcuchu).

## [1.4.1] – 2026-10-04
### Naprawiono
- Funkcje wyłączone w **Role i uprawnienia** znikają z interfejsu użytkownika zamiast kończyć się błędem 403:
  menu boczne, kafelki „Szybkie narzędzia” na pulpicie i w „Narzędziach”, menu „…” przy dokumentach,
  menu pobierania w edytorze, przyciski „Utwórz PDF” / „Połącz” / „Otwórz PDF”, „Zmień nazwę”.
  Jedno źródło prawdy: `ToolsController::TOOL_PERMISSIONS` (narzędzia tworzące dokumenty wymagają też
  `documents.upload`); ochrona po stronie serwera (403) pozostaje.

## [1.4.0] – 2026-10-04
### Dodano
- **Calibre**: e-booki EPUB, MOBI, AZW3, FB2, LIT, PDB → PDF w „Utwórz PDF” (A4, numeracja stron) oraz nowe formaty
  docelowe **Kindle AZW3 i MOBI** w „Konwertuj PDF” (również dla skanów przez OCR).
- **Silnik poprawy skanów open source** (zamiast płatnego ABBYY PreciseScan): ImageMagick wyrównuje oświetlenie
  i kontrast (dzielenie przez rozmyte tło), **unpaper** prostuje stronę i usuwa czarne krawędzie, szum i plamy
  (np. dziurki po dziurkaczu). ABBYY pozostaje opcjonalny – używany, gdy skonfigurowano licencję.
- Instalator Debiana instaluje Calibre i konfiguruje dla PHP-FPM tryb offscreen Qt (renderowanie PDF bez ekranu).

### Zmieniono
- Panel **System** rozróżnia stany narzędzi: dostępny / brak / **zastąpiony** / **opcjonalny** z wyjaśnieniem.
  wkhtmltopdf oznaczony jako zastąpiony przez Chrome/Chromium – projekt porzucony (2023) z niezałataną podatnością
  CVE-2022-35583, celowo nie jest instalowany.

## [1.3.2] – 2026-10-03
### Zmieniono
- Logo „Created by” w stopce: pozostaje monogram WL i napis CREATED BY (usunięto „W. Lewicki”);
  dane autora wyświetla karta po najechaniu.

## [1.3.1] – 2026-10-03
### Dodano
- Znak **„Created by”** w stopce wszystkich stron (także na stronie logowania): logo z monogramem WL; po najechaniu
  (lub fokusie klawiaturą / dotknięciu) karta z okrągłym zdjęciem autora – Wojciech Lewicki, Informatyk,
  Kujawsko-Pomorski Urząd Wojewódzki. Stały element każdej kolejnej wersji.

## [1.3.0] – 2026-10-03
### Dodano
- **Panel administratora → Dokumenty** – przegląd dokumentów wszystkich użytkowników (uprawnienie `documents.view_all`):
  - wyszukiwanie po nazwie i treści, filtr właściciela i statusu (aktywne / w koszu / wszystkie), sortowanie, stronicowanie,
  - podsumowanie liczby dokumentów i zajętości (z wersjami) dla każdego użytkownika,
  - akcje: podgląd w edytorze, pobranie, historia wersji, konwersja, przeniesienie do kosza i przywrócenie,
  - zmiana właściciela (np. po odejściu pracownika) i trwałe usunięcie z potwierdzeniem słowem USUŃ
    (uprawnienie `admin.users`; usuwa pliki wszystkich wersji z dysku),
  - wszystkie operacje zapisywane w dzienniku zdarzeń.

## [1.2.0] – 2026-10-03
### Dodano
- **OCR przy konwersji skanów do Word/ODT/EPUB/FB2/HTML/TXT** – strony bez warstwy tekstowej są rozpoznawane
  (Tesseract), a dokument budowany z edytowalnego tekstu z odtworzonym układem: akapity, wyrównanie (do lewej,
  wyśrodkowanie, do prawej, justowanie), rozmiar czcionki, nagłówki, punkty list i paragrafy (§), łączenie
  przeniesień wyrazów. Wcześniej pdf2docx/LibreOffice wstawiały skan jako obraz.
  - serwer: `ScanOcr` (Ghostscript 300 DPI → prostowanie ImageMagick → Tesseract TSV → układ → DocumentWriter),
  - przeglądarka: Tesseract.js z tym samym algorytmem układu (gdy serwer nie ma Tesseracta),
  - opcja „Dokumenty skanowane”: automatycznie (≥ 50% stron bez tekstu) / zawsze / bez OCR, wybór języków.
- Modele **tessdata_best** (dokładniejsze rozpoznawanie „ą/ę/ł”, „§”, „zł”) – używane automatycznie z `.tessdata/`
  lub `/usr/local/share/tessdata_best` (instalator Debiana pobiera je dla skonfigurowanych języków); także w OCRmyPDF.
- Korekty typowych błędów OCR w polskich dokumentach („$ 2” → „§ 2”, „700 zt” → „700 zł”, „sie” → „się”).
- Dziennik konwersji zapisuje rzeczywiście użyty silnik (np. „OCR Tesseract (pol+eng, modele best)”).

### Naprawiono
- `bin/migrate.php`: wyrażenie `\R` bez flagi `/u` mogło rozcinać instrukcje SQL na literze „ą”.

## [1.1.3] – 2026-10-03
### Naprawiono
- Menu akcji („…”) w tabeli dokumentów było przycinane przez przewijany kontener tabeli – menu rozwijane
  pozycjonowane są teraz względem okna (Popper `strategy: fixed`). Ta sama poprawka dla menu „Status” w panelu komentarzy.

## [1.1.2] – 2026-10-03
### Naprawiono
- OCR serwerowy (OCRmyPDF) kończył się błędem 500 na serwerze Linux z PHP-FPM: `getenv()` zwraca tam klucze
  liczbowe (int), a `strcasecmp()` przy `strict_types` wymaga stringów – `ToolRunner::mergeEnv()` rzutuje teraz nazwy
  zmiennych na string i pomija nieprawidłowe wpisy.

## [1.1.1] – 2026-10-03
### Zmieniono
- Diagnostyka błędów: każdy nieobsłużony błąd ma identyfikator `ERR-XXXXXX` widoczny w komunikacie i w logu
  `storage/logs/php-error.log` (z pełnym śladem stosu); administrator widzi w komunikacie przyczynę błędu.

## [1.1.0] – 2026-10-03
### Dodano
- Pakiet wdrożeniowy dla Debiana 13: `deploy/install.sh` – automatyczna instalacja Apache 2.4 + PHP-FPM 8.4, MariaDB,
  LibreOffice, qpdf, Ghostscript, ImageMagick, OCRmyPDF + Tesseract, pdf2docx, Chromium, czcionek, TLS, CRON i logrotate;
  ponowne uruchomienie działa jako aktualizacja (kopia zapasowa + migracje).
- `deploy/build-package.sh` – budowanie paczki `dist/pdf-konwenter-<wersja>.tar.gz` bez danych lokalnych.
- `bin/migrate.php` – migracje schematu bazy przy aktualizacji.
- Instrukcja `deploy/INSTALACJA.md`.

### Zmieniono
- `bin/install.php`: hasło bazy także ze zmiennej `PDFK_DB_PASSWORD`, poprawne kody wyjścia przy błędach.
- Wykrywanie `magick` i `chromium` w standardowych ścieżkach Linuksa.

## [1.0.2] – 2026-10-03
### Dodano
- Obsługa narzędzi Pythona (OCRmyPDF, pdf2docx) instalowanych w środowisku wirtualnym projektu `.venv/` – wykrywane automatycznie.
- OCRmyPDF otrzymuje w PATH katalogi Tesseracta i Ghostscripta (na Windows nie są w systemowym PATH).

## [1.0.1] – 2026-10-03
### Zmieniono
- Wykrywanie narzędzi serwerowych w katalogach z numerem wersji na Windows (qpdf, Ghostscript, ImageMagick, Tesseract) – zawsze najnowsza zainstalowana wersja.
- Parametry z hasłami oznaczone `#[\SensitiveParameter]` (nie trafiają do śladów stosu i logów).

### Naprawiono
- HTML → PDF przez Chrome headless: usunięto flagę `--blink-settings=scriptEnabled=false`, która w nowych wersjach Chrome blokowała zapis PDF (skrypty nadal usuwa sanityzacja HTML).
- Unikalne nazwy plików kopii zapasowych (kolizja przy przywracaniu w tej samej sekundzie).
- Zgodność z PHP 8.5: `fputcsv()` z jawnym parametrem `escape`, stała `Pdo\Mysql::ATTR_MULTI_STATEMENTS`.

## [1.0.0] – 2026-10-03
### Dodano
- Architektura MVC (PHP 8.2+, MySQL/MariaDB, Bootstrap 5.3), front controller, router z middleware (logowanie, uprawnienia, CSRF, tryb serwisowy).
- Bezpieczeństwo: sesje HttpOnly/SameSite z limitem bezczynności, Argon2id, blokada brute-force, RBAC, CSP i nagłówki bezpieczeństwa, pliki poza katalogiem publicznym, dziennik zdarzeń.
- Pulpit pracownika, biblioteka dokumentów z wersjonowaniem i udostępnianiem, wyszukiwanie globalne (treść, komentarze, zakładki, metadane).
- Przeglądarka/edytor PDF: tryby jedno- i dwustronicowy, pełny ekran, miniatury, konspekt i zakładki, załączniki, metadane, druk, wyszukiwanie z oznaczaniem wyników.
- Komentarze: wyróżnienia, podkreślenia, przekreślenia, notatki, komentarze obszaru, stemple z biblioteką, wątki odpowiedzi, statusy, filtry; eksport jako natywne adnotacje PDF lub spłaszczone.
- Edycja: tekst istniejący, nowe bloki z dopasowaniem tła, obrazy (dodaj/usuń/przesuń/obróć), gumka/redakcja, organizacja stron, metadane, załączniki.
- Narzędzia: tworzenie PDF (Office/Visio, obrazy, HTML, tekst), łączenie i podział, konwersja (DOCX, XLSX, ODT, ODS, EPUB, FB2, HTML, TXT, PNG/JPG, PDF/A), OCR, skanowanie z poprawą jakości, ekstrakcja tekstu/tabel (regulowane separatory)/obrazów, zabezpieczenia (AES-256, znak wodny, sanityzacja), wirtualna drukarka.
- Panel administratora: statystyki, użytkownicy, role i uprawnienia, kopie zapasowe (tworzenie/przywracanie/retencja), dziennik zdarzeń z eksportem CSV, ustawienia, stan silników konwersji.
