Lista wszystkich wersji aplikacji KSeFka.
30 dni PRO za darmo dla każdej instalacji bez licencji: biała lista VAT, kody QR płatności, pro-formy, faktury cykliczne, CLI i MCP.
Dodane
30-dniowy okres próbny PRO, wspólny dla aplikacji, CLI i MCP (#1322). Dotąd aplikacja nie miała okresu próbnego, a CLI i MCP dawały 3 dni. Teraz każda instalacja dostaje 30 dni pełnego PRO bez rejestracji i bez połączenia z siecią: okres rusza przy pierwszym uruchomieniu aplikacji albo przy pierwszej komendzie CLI i liczy się wspólnie dla wszystkich trzech kanałów. Dotyczy to także instalacji sprzed tej wersji bez licencji: od pierwszego uruchomienia nowej wersji mają 30 dni na wypróbowanie kodów QR płatności i pliku przelewów, białej listy VAT, pro-form, załączników, własnego logo, wysyłki e-mail, integracji, CLI i MCP. Pełne 30 dni dostają też użytkownicy, którzy wcześniej uruchomili CLI z 3-dniowym okresem próbnym; tamta data nie jest brana pod uwagę (#1351). Ustawienia → Licencja pokazują odznakę "PRO (okres próbny)" z liczbą dni i datą końca, a w ostatnich 7 dniach i po zakończeniu nad treścią pojawia się zamykany pasek z przyciskiem zakupu. Po zakończeniu funkcje PRO wracają do trybu darmowego tak jak po unieważnieniu licencji: pro-formy, załączniki, logo i ustawienia zostają w aplikacji i wracają do użytku po aktywacji tokena. Sekcja CLI w Ustawieniach nie pokazuje już własnych komunikatów o okresie próbnym, a `ksefka status` zwraca w polu `license` status `trial` z liczbą dni i datą końca albo `trial_expired`. Zapisany token licencji, który nie daje się odszyfrować albo nie przechodzi walidacji, nie jest już kasowany przez sprawdzanie w tle (kasuje je tylko unieważnienie potwierdzone przez serwer) i nie jest przykrywany okresem próbnym: Ustawienia → Licencja pokazują ostrzeżenie o ponownym wklejeniu tokena, komendy PRO w CLI odmawiają z podpowiedzią `ksefka authorize <TOKEN>`, a `ksefka status` zwraca wtedy `free` z `invalid_token: true`.
Biała lista VAT dla faktur otrzymanych (PRO) (#1308). Przelew powyżej 15 000 zł na rachunek spoza Wykazu podatników VAT oznacza utratę kosztu w PIT lub CIT i odpowiedzialność solidarną za VAT sprzedawcy, a księgowa widzi fakturę zwykle już po przelewie. Teraz około minuty po każdej synchronizacji z KSeF aplikacja sprawdza w wykazie Ministerstwa Finansów rachunki z nowych, nieopłaconych faktur otrzymanych płatnych przelewem (jedno zapytanie na sprzedawcę i dzień, do 30 sprzedawców w zapytaniu) i zapisuje wynik z numerem potwierdzenia MF jako dowód należytej staranności. W szczegółach faktury przy numerze rachunku stoi ikona stanu: zielona (na liście), czerwona z czerwonym tłem numeru (poza listą), bursztynowa (nie udało się sprawdzić) albo lupa do sprawdzenia ręcznego, także przy fakturze opłaconej lub starszej; kliknięcie pokazuje datę, numer potwierdzenia do skopiowania i przycisk "Sprawdź ponownie". Faktura z rachunkiem spoza listy ma znak zakazu na liście faktur, a sprawdzenie, które znalazło taki rachunek, kończy się ostrzeżeniem z liczbą faktur. Zaznaczone faktury otrzymane można sprawdzić zbiorczo z menu "Plik płatności". Przed zapisem zwykłego pliku przelewów (Elixir-0) aplikacja sprawdza rachunki ponownie i dla rachunku spoza listy albo niesprawdzonego pyta: "Usuń z pliku", "Zapłać w MPP" (przelew z podzieloną płatnością w tym samym pliku) albo "Zapłać mimo to", a po zapisie przelewu na rachunek spoza listy przypomina o zawiadomieniu ZAW-NR w ciągu 7 dni. Plik przelewów z CLI i MCP pomija faktury z rachunkiem spoza listy według ostatniego zapisanego sprawdzenia. Gdy rachunku nie ma na liście, sekcja "Zapłać QR-em" zasłania kod i pokazuje ostrzeżenie. Dzienny limit zapytań do wykazu wstrzymuje sprawdzanie do północy. Sprawdzanie działa w środowisku produkcyjnym KSeF; bez PRO przy numerze rachunku stoi szara korona z opisem funkcji.
Status licencji w anonimowym sygnale użycia (#1324). Przy sprawdzaniu aktualizacji aplikacja wysyła teraz obok losowego identyfikatora instalacji, typu zdarzenia, wersji i systemu także rodzaj licencji: `free`, `trial`, `trial_expired` albo `pro` (build z App Store liczy się jako `pro`, zapisany, ale nieważny token jako `free`). Nagłówek nie zawiera adresu e-mail, dat ani tokena. Dzięki temu po wydaniu 30-dniowego okresu próbnego (#1322) da się policzyć, ile instalacji jest w okresie próbnym, u ilu się zakończył i ile przeszło na PRO. Polityka prywatności (pkt 2.1), opis w Ustawienia → Prywatność i odpowiedź w FAQ na stronie pobierania wymieniają status licencji wśród przesyłanych danych.
Kopiowanie do schowka w szczegółach faktury (#1311). Obok numeru faktury, numeru KSeF, nazwy i NIP kontrahenta, numeru konta i IBAN, kwoty brutto w podsumowaniu VAT oraz rachunku, tytułu i kwoty w sekcji "Zapłać QR-em" jest ikonka kopiowania. Przy numerze konta i IBAN-ie, także w sekcji QR, widać ją stale, przy pozostałych polach po najechaniu myszą albo po przejściu klawiszem Tab. Wartość trafia do schowka w postaci do wklejenia w bankowości: numer konta bez spacji (prefiks kraju zostaje), kwota z przecinkiem, bez separatora tysięcy i bez waluty (np. `12345,50`), NIP bez kresek (inne identyfikatory podatkowe bez zmian). Po skopiowaniu ikonka na chwilę zmienia się w ✓ z podpowiedzią "Skopiowano", bez komunikatu w rogu ekranu. Zaznaczanie tekstu myszą działa jak dotąd, bo kopiuje tylko ikonka.
Filtr "Spoza białej listy" na liście faktur i przycisk "Pokaż" w ostrzeżeniu po automatycznym sprawdzeniu białej listy VAT (PRO). Dotąd ostrzeżenie podawało tylko liczbę faktur z rachunkiem spoza białej listy, a te faktury trzeba było szukać na liście po ikonie ⛔. Teraz obok przełączników "Niezapłacone" i "Poza KSeF" jest przełącznik "Spoza białej listy", który zostawia na liście tylko faktury otrzymane z tą ikoną, i łączy się z pozostałymi filtrami. "Pokaż" w ostrzeżeniu otwiera faktury otrzymane z włączonym filtrem i wyłącza filtr statusu oraz "Poza KSeF", żeby nie ukryły żadnej z tych faktur. Przełącznik widać tylko tam, gdzie działa sprawdzanie białej listy (licencja PRO lub okres próbny, środowisko produkcyjne) i poza widokiem faktur wystawionych, a aplikacja nie zapamiętuje jego stanu po zamknięciu (#1314).
Oznaczenie powtórzonego numeru faktury wystawionej (#1331). Dotąd faktura z numerem, który ma już inna faktura, wyglądała zwyczajnie aż do próby wysyłki, a szkic z takim numerem mógł wcześniej trafić do klienta jako PDF. Teraz na liście faktur obok numeru stoi ikona z podpowiedzią "Ten numer ma też inna faktura wystawiona w tym samym roku", a szczegóły faktury pokazują ramkę z pozostałymi fakturami o tym numerze: datą, kontrahentem, statusem i przyciskiem "Otwórz". Liczą się faktury wystawione tej samej firmy z tego samego roku wystawienia, w każdym statusie, także dwa szkice; pro-formy i faktury otrzymane nie. Aplikacja niczego nie przenumerowuje: numer szkicu zmienia się w edycji, a faktury przyjętej przez KSeF zmienić nie można. Wynik `ksefka-cli list-invoices` i narzędzia MCP `list_invoices` ma to samo oznaczenie w polu `has_number_clash`.
Zmienione
Sekcja "Zapłać QR-em" bez licencji PRO pokazuje dane przelewu z faktury (rachunek, tytuł, kwotę), a w miejscu kodu rozmyty przykładowy kod z przyciskiem "Więcej o PRO" zamiast jednej linijki tekstu (#1312). Rozmyty kod nie jest poprawnym kodem QR, więc aplikacja banku nic z niego nie odczyta. Przyciski zakupu PRO w aplikacji prowadzą przez adresy `ksefka.com/go/pro-*` do opisu danej funkcji na stronie /pro, która ma teraz osobną sekcję dla każdej funkcji PRO. Na PDF faktur i pro-form bez PRO nadal nie ma żadnego kodu.
Polityka prywatności i Ustawienia → Prywatność opisują skrót adresu IP (#1354). Przy pierwszym sprawdzeniu aktualizacji z nowej instalacji serwer ksefka.com zapisuje na 30 dni skrót adresu z tajnym kluczem, żeby policzyć powtórne nowe instalacje z tego samego adresu. Ze skrótu nie da się odtworzyć adresu, a serwer nie łączy go z identyfikatorem instalacji.
Poprawione
Pasek o końcu okresu próbnego PRO mówi, co dokładnie przestanie działać (#1347). Dotąd w ostatnich 7 dniach wymieniał tylko część funkcji PRO, a po zakończeniu podawał tylko, że dane zostają. Teraz ostrzeżenie zaczyna od funkcji, które działają w tle albo widzi klient: faktur cyklicznych, automatycznej wysyłki faktur e-mailem po przyjęciu przez KSeF oraz własnego logo i kodu QR do zapłaty na PDF, a potem wymienia pro-formy, kod QR i białą listę VAT przy fakturach otrzymanych, integracje, CLI i MCP oraz limit wersji bezpłatnej dla załączników i pliku przelewów. Po zakończeniu pasek mówi, że automatyczna wysyłka e-mailem nie działa, a PDF powstaje bez logo i kodu QR. Gdy firma ma harmonogram faktury cyklicznej, pasek dodaje, że aplikacja wstrzymuje harmonogram w dniu terminu i że po aktywacji PRO trzeba go wznowić w zakładce Cykliczne przyciskiem "Wznów".
Strona ksefka.com/pro i dokumentacja licencji opisują funkcje PRO tak, jak działają w aplikacji. Lista funkcji PRO obejmuje automatyczną wysyłkę faktury e-mailem po przyjęciu przez KSeF, odpowiedź "Co zawiera licencja PRO?" (także w danych strukturalnych dla wyszukiwarek) podaje darmowe limity: jeden eksport pliku przelewów i jeden załącznik do faktury otrzymanej, a zdanie o darmowym PDF zaznacza, że logo, dodatkowy tekst i kod QR do zapłaty na PDF należą do PRO (kod weryfikacyjny KSeF zostaje na PDF bez licencji). Tabela porównania FREE i PRO w dokumentacji ma wiersze dla białej listy VAT, pliku przelewów, załączników i automatycznej wysyłki e-mail, z darmowym limitem w kolumnie FREE, i powstaje z tej samej listy co strona /pro. Dokumentacja faktur wystawionych mówi, że załączniki do nich wymagają PRO, a dokumentacja wysyłki e-mailem opisuje wysyłkę automatyczną i podaje właściwą nazwę zakładki: Ustawienia → Email zamiast nieistniejącej "Poczta e-mail (SMTP)" (#1141).
Status licencji w aplikacji odświeża się po powrocie do okna także na macOS. Dotąd otwarta od kilku dni aplikacja pokazywała nieaktualną liczbę dni okresu próbnego PRO, a baner ostatnich 7 dni albo baner po wygaśnięciu pojawiał się dopiero po restarcie: na macOS przełączenie na inną aplikację nie ukrywa okna, więc sygnał, na który czekała aplikacja, nie przychodził. Teraz wystarczy wrócić do okna. Po powrocie odświeżają się też inne dane starsze niż 30 sekund, tak jak dotąd po przywróceniu zminimalizowanego okna; wszystkie pochodzą z lokalnej bazy, więc powrót do okna nie uruchamia synchronizacji z KSeF. Gdy komenda odmówi funkcji PRO, bo okres próbny właśnie się skończył, aplikacja też od razu pobiera status licencji od nowa (#1327, #1325).
Baner okresu próbnego PRO i pozostałe banery nad treścią strony mają szerokość treści strony. Dotąd na pulpicie zajmowały całą szerokość okna, a karty pulpitu były węższe i wyśrodkowane. Pulpit, Kontrahenci, Konta bankowe i Produkty zajmują teraz w szerokim oknie pełną szerokość swojego kontenera zamiast szerokości zawartości, a banery wyrównują się z nimi; na listach faktur, pro-form i faktur cyklicznych zostają na całą szerokość, w Ustawieniach przy lewej krawędzi (#1328).
Nieczytelny albo uszkodzony `preferences.json` nie jest już nadpisywany ustawieniami domyślnymi przy zmianie środowiska, usuwaniu unieważnionego tokena, zapisie daty sprawdzenia licencji ani cichym szyfrowaniu tokena zapisanego jawnym tekstem. Dotąd każda z tych operacji mogła skasować token licencji i wybrane środowisko. Teraz zmiana środowiska kończy się komunikatem, a operacje w tle zostawiają plik bez zmian i zapisują błąd w dzienniku. Aktywacja licencji na uszkodzonym pliku działa dalej (komunikat o uszkodzonym pliku każe wpisać klucz ponownie), ale tylko gdy obok leży kopia `preferences.json.corrupt-*`; aplikacja zapisuje wtedy plik od nowa z licencją i bieżącym środowiskiem KSeF (`ksefka authorize` bez środowiska), a obie ostrzegają o tym i podają ścieżkę kopii. Plik, którego nie da się odczytać (uprawnienia, blokada), nie jest nadpisywany, a aktywacja kończy się błędem. Sprawdzenie unieważnienia licencji na serwerze ma limit 15 sekund, a unieważnienie starego klucza nie kasuje już klucza aktywowanego w trakcie tego sprawdzenia. Gdy przy starcie okres próbny PRO jest niedostępny, bo pliku nie da się odczytać albo zapisać, a nie ma płatnej licencji, aplikacja pokazuje ostrzeżenie zamiast samego statusu FREE. Przy uszkodzonym pliku z kopią komunikaty radzą zacząć go od nowa (usunąć `preferences.json` albo wpisać klucz licencji) zamiast przywracać kopię, która zawiera te same uszkodzone dane; gdy kopii nie udało się zapisać, radzą najpierw skopiować plik w bezpieczne miejsce, a przy pliku, którego nie da się odczytać, sprawdzić uprawnienia i blokadę pliku (#1325).
Kurs NBP dla dokumentu w walucie obcej jest pobierany i zapisywany w jednym miejscu, przy tworzeniu dokumentu, niezależnie od tego, skąd dokument przychodzi. Dotąd pełną obsługę kursu (umowny i kurs NBP do podsumowań) miał tylko formularz w aplikacji: `ksefka-cli create-invoice --from-json` bez pola `exchange_rate_info` kończyło się błędem "Faktura walutowa wymaga podania kursu wymiany i daty kursu", narzędzie MCP `create_invoice` uzupełniało kurs umowny, ale nie zapisywało kursu NBP z dnia wystawienia, przez co pulpit nie liczył takiej faktury w PLN do następnego uruchomienia aplikacji, harmonogram cykliczny w EUR nie generował żadnej faktury (ani z timera, ani z "Generuj teraz", CLI czy MCP), kopia faktury w EUR z CLI i zamiana pro-formy w EUR na fakturę padały na tej samej walidacji, a pro-forma w EUR z aplikacji nie dostawała kursu NBP. Teraz każda z tych ścieżek, gdy payload nie podaje kursu umownego, bierze średni kurs NBP z ostatniego dnia roboczego przed datą sprzedaży (albo wystawienia), a po zapisie dokłada kurs NBP z dnia wystawienia do podsumowań w PLN. Podany kurs umowny ma pierwszeństwo. Gdy NBP nie odpowiada, dokument bez kursu umownego nie powstaje (numer nie jest zużyty), a harmonogram cykliczny zgłasza błąd i próbuje przy następnym przebiegu; dokument z podanym kursem umownym zapisuje się bez kursu NBP, aplikacja ostrzega o tym tak samo przy fakturze, kopii, pro-formie, jej zamianie i fakturze cyklicznej, CLI wypisuje powód na stderr, narzędzia MCP zwracają go obok dokumentu, a brak uzupełnia pobieranie przy następnym uruchomieniu aplikacji (#994).
Faktura z zamiany pro-formy dostaje kolejny wolny numer, a nie numer, który ma już inna faktura. Dotąd numer brał się z samego licznika numeracji, a licznik rośnie dopiero przy zatwierdzeniu faktury do wysyłki. Gdy w miesiącu były już szkice albo faktury z numerem wpisanym ręcznie, zamiana pro-formy nadawała numer zajęty, także przez fakturę przyjętą już przez KSeF, i robiła to bez ostrzeżenia. Dwie zamiany z rzędu bez zatwierdzania pierwszej faktury dostawały ten sam numer. Ten sam błąd miały kopia faktury, faktura cykliczna oraz tworzenie faktury bez numeru w JSON-ie przez `ksefka-cli create-invoice` i narzędzie MCP `create_invoice`. Teraz numer nadawany automatycznie uwzględnia wszystkie faktury z okresu, także szkice, i pomija numery zajęte w tym samym roku. Faktur z już powtórzonym numerem aplikacja nie przenumerowuje: zatwierdzenie do wysyłki i wysyłka do KSeF odmawiają faktury, której numer ma inna faktura wystawiona w tym samym roku, czekająca w kolejce, wysłana albo przyjęta przez KSeF. Komunikat podaje numer i id tamtej faktury. Faktura czekająca w kolejce wraca wtedy do szkicu z tym komunikatem. Jeśli to inna faktura, wystarczy zmienić numer zatrzymanej faktury w edycji (#1098).
Faktury cykliczne po zakończeniu okresu próbnego albo unieważnieniu licencji PRO nie powstają już w tle. Dotąd tylko interfejs traktował je jako funkcję PRO: harmonogram założony w 30-dniowym okresie próbnym albo przy licencji, która potem została unieważniona, dalej co godzinę wystawiał faktury. Teraz bez PRO aplikacja nie tworzy, nie edytuje, nie wznawia i nie generuje harmonogramów, a "Utwórz cykliczną" w szczegółach faktury otwiera informację o licencji PRO zamiast formularza. Listę i szczegóły harmonogramów nadal widać, a każdy harmonogram można wstrzymać albo usunąć; przyciski "Generuj teraz" i "Wznów" znikają. Harmonogram, któremu minął termin, aplikacja wstrzymuje przy najbliższym przebiegu, a powiadomienie i notka na stronie faktur cyklicznych mówią, ile harmonogramów wstrzymała z braku licencji. Po aktywacji PRO wstrzymany harmonogram wznawia się przyciskiem "Wznów": następna faktura powstaje w najbliższym terminie od dnia wznowienia, bez hurtowego dopisywania faktur z datami z przeszłości za okresy bez licencji. Gdy aplikacja nie potrafi odczytać pliku ustawień albo zapisanego klucza licencji, przebieg w tle niczego nie zmienia i, gdy są zaległe harmonogramy, zgłasza błąd z przyczyną, żeby nie wstrzymać harmonogramów płacącego klienta. CLI bez zmian, bo każde jego polecenie faktur cyklicznych już wymagało PRO; serwer MCP sprawdza licencję przy każdym wywołaniu narzędzia (#1340). Zdarzenie `recurring:invoices-generated` niesie pole `pro_required` (#1329).
Serwer MCP sprawdza licencję PRO przy każdym wywołaniu narzędzia, nie tylko przy starcie. Dotąd sesja MCP uruchomiona w 30-dniowym okresie próbnym działała po jego końcu tak długo, jak klient AI (np. Claude Desktop) trzymał serwer uruchomiony, a więc często przez wiele dni: tworzyła faktury, wysyłała je do KSeF i generowała faktury cykliczne. Na bieżąco licencję sprawdzały tylko narzędzia pro-form i dodawanie załączników. Teraz bez licencji PRO i bez trwającego okresu próbnego każde narzędzie, także tylko do odczytu, odpowiada błędem zaczynającym się od "Funkcja PRO:", z adresem strony zakupu i poleceniem `ksefka authorize <TOKEN>` (przy zapisanym, ale nieprawidłowym tokenie z prośbą o ponowną aktywację, a przy pliku ustawień, którego nie da się odczytać, ze wskazówką, jak go naprawić), i niczego nie zmienia w bazie. Bez uprawnienia przez MCP nie da się więc dodać pierwszego załącznika ani zrobić jednego darmowego eksportu pliku przelewów; oba darmowe limity zostają w aplikacji, a eksport pliku przelewów także w CLI. Lista narzędzi pozostaje dostępna, a po aktywacji licencji narzędzia działają od następnego wywołania, bez restartu klienta AI. Dokumentacja MCP na ksefka.com wymienia licencję PRO albo okres próbny wśród wymagań (#1340).
Po zakończeniu okresu próbnego PRO aplikacja od razu pokazuje aktualny status licencji także wtedy, gdy odmówi zapisu integracji (webhook, dziennik zdarzeń), personalizacji (logo, logo w pasku bocznym, dodatkowy tekst na PDF), kodu QR do zapłaty na PDF albo kolejnego załącznika. Dotąd robiła to tylko przy pro-formach, fakturach cyklicznych, białej liście VAT i pliku przelewów, a przy tych funkcjach status w Ustawieniach i baner zmieniały się dopiero po powrocie do okna albo po godzinie. Treść komunikatów się nie zmienia. Gdy aplikacja odmówi dodania załącznika, zamiast komunikatu o błędzie otwiera się informacja o licencji PRO, tak jak po kliknięciu "Dodaj załącznik" bez licencji. Narzędzie MCP `attach_file` zwraca ten sam błąd zaczynający się od "Funkcja PRO:" co dotąd (#1334).
Lista faktur pusta przez przełącznik "Niezapłacone" albo "Poza KSeF" pokazuje komunikat "Brak faktur pasujących do kryteriów wyszukiwania.". Dotąd, gdy żadna faktura nie spełniała warunku przełącznika, a wyszukiwanie i filtr statusu były puste, lista wyglądała jak w nowej firmie: "Brak faktur" z zachętą do utworzenia pierwszej faktury albo synchronizacji z KSeF i przyciskiem "Nowa faktura" (#1338).
Anonimowy sygnał użycia na ksefka.com nie gubi już całego sprawdzenia aktualizacji, gdy Redis odrzuci zapis daty pierwszego sprawdzenia instalacji. Dotąd taki błąd (np. przekroczony czas) przerywał zapis przed resztą danych: licznikiem sprawdzeń, rozkładem wersji i systemów, aktywnymi instalacjami dnia i miesiąca, rekordem instalacji i zdarzeniem. Teraz przepadają tylko liczniki nowych instalacji, reszta trafia do statystyk, a błąd jest zgłaszany do Sentry jako osobny etap `first-seen`. Aplikacja i przekierowanie na manifest aktualizacji bez zmian (#1335).
Jednorazowe ustawianie okresów numeracji po aktualizacji ze starszej wersji liczy tylko faktury, bez pro-form. To zabezpieczenie: ustawianie odbyło się w istniejących bazach przed wprowadzeniem pro-form, więc żaden licznik nie został przez nie zawyżony (#1142).
Szczegóły faktury: przy rachunku, który ma numer i IBAN, dopisek "(w KSeF)" z podpowiedzią "Ten zapis rachunku trafił do faktury w KSeF" zastępuje dopisek "(aktywny)". Dotąd "(aktywny)" pojawiał się przy każdym pojedynczym rachunku, także na fakturach otrzymanych, gdzie nie było między czym wybierać, a znikał przy kilku rachunkach. Numer konta i IBAN nie zawijają się już w karcie "Dane faktury": miejsca ustępuje kolumna etykiet (#1310).
Log aplikacji nie zapisuje już adresów pobierania paczek eksportu KSeF z tokenem dostępu (`sig=`). Użytkownicy przysyłają `KSeFka.log` w zgłoszeniach, a formularz "Kontakt" dołącza koniec logu do zgłoszenia. Teraz log podaje adres bez parametrów zapytania, także w ostrzeżeniu o limicie zapytań i w komunikatach o błędzie pobierania (#1305).Dodane
Przycisk "Pobierz UPO" w szczegółach faktury wystawionej, która ma numer KSeF, ale nie ma UPO. Dotąd aplikacja pobierała UPO tylko zaraz po wysyłce z KSeFki. Gdy wtedy się nie udało albo fakturę wysłano stroną Ministerstwa Finansów lub innym programem, szczegóły pokazywały "Dane UPO niedostępne" i UPO nie było skąd wziąć. Teraz aplikacja szuka w KSeF sesji, w której wysłano fakturę, wśród sesji z dni wokół daty przyjęcia zapisanej w numerze KSeF, i pobiera z niej UPO. Data przyjęcia, kod weryfikacyjny i link z UPO zastępują wtedy wartości policzone z treści faktury. Wysyłka z KSeFki zapisuje odtąd numer sesji, a aplikacja pamięta sesje już przejrzane, więc kolejna faktura z tej samej sesji nie wymaga ponownego szukania. KSeF mocno ogranicza zapytania o sesje (np. 20 list faktur sesji na minutę), dlatego jedno naciśnięcie przegląda najwyżej 10 sesji i pyta o UPO w najwyżej 10 dużych sesjach wsadowych; gdy w tych dniach sesji jest więcej, komunikat prosi o ponowienie za minutę i aplikacja zaczyna wtedy od nieprzejrzanych. Przekroczenie limitu KSeF wstrzymuje pobieranie UPO tak samo jak synchronizację (#1202). Sesję otwartą przez inną osobę albo biuro rachunkowe KSeF pokazuje tylko tokenowi z uprawnieniem "Przeglądanie historii sesji" i komunikat o nieznalezionej sesji o tym przypomina (#1204).
Podstawa zwolnienia z VAT przy tworzeniu i aktualizacji produktu przez `ksefka-cli` (flagi `--vat-exemption-reason-type` i `--vat-exemption-reason` w `create-product` i `update-product`) oraz przez narzędzie MCP `create_product` (parametry o tych samych nazwach). Dotąd tylko formularz produktu w aplikacji zapisywał własną podstawę zwolnienia produktu ze stawką "zw" (#1200) — produkt utworzony z CLI lub przez AI dostawał `null` w obu polach i na fakturze korzystał z podstawy zapamiętanej ostatnio dla firmy, a nie własnej. Normalizacja jest taka sama jak w formularzu: stawka inna niż "zw" albo pusty tekst przepisu zerują oba pola, a brak typu dostaje domyślnie "ustawa o VAT". W przeciwieństwie do formularza (który wybiera typ z listy) flagi CLI i parametr MCP przyjmują wolny tekst — literówka w typie podstawy (np. "directve") kończy się teraz błędem, a nie cichą zamianą na "ustawa o VAT". Każda aktualizacja produktu przez flagi (nie tylko zmiana `--vat-rate`) stosuje tę regułę do zapisanych wcześniej wartości, więc `update-product` z dowolną flagą pola czyści podstawę zapamiętaną przy produkcie ze stawką inną niż "zw", zamiast zostawiać ją bez zmian; `--from-json` z pełnym payloadem pozostaje bez tej normalizacji, jak dotąd (#1206).
Przycisk "Zapisz UPO" w szczegółach faktury, która ma UPO. Dotąd UPO było tylko przechowywane w aplikacji, a biuro rachunkowe nie miało jak dostać go jako pliku. Przycisk otwiera okno zapisu i zapisuje UPO w takiej postaci, w jakiej zwrócił je KSeF, jako plik XML o nazwie `UPO_<numer KSeF>.xml`. Gdy faktura ma datę przyjęcia, ale nie ma zapisanej treści UPO (np. po przywróceniu kopii zapasowej albo imporcie konfiguracji), komunikat mówi, że nie ma czego zapisać (#1287).
Adres kontrahenta spoza Polski w dwóch wolnych liniach. Pola ulica, numer budynku, numer lokalu, kod i miasto nie mieszczą adresu chińskiego, japońskiego czy koreańskiego: pokój, budynek i osiedle, dzielnica, prowincja nie mają w nich miejsca. Formularz kontrahenta i dane kontrahenta na fakturze mają dla kraju innego niż Polska przełącznik "Adres w dwóch wolnych liniach". Po jego zaznaczeniu pola strukturalne chowają się (ich zawartość wraca po wyłączeniu przełącznika), a w ich miejscu stoją pola "Linia adresu 1" (wymagana) i "Linia adresu 2". Linie trafiają w tej postaci do XML-a wysyłanego do KSeF (elementy AdresL1 i AdresL2, które FA(3) traktuje jako wolny tekst), na PDF faktury i do podglądu faktury, a do pliku przelewów Elixir jako adres odbiorcy, skrócony do długości pola. Faktura pobrana z KSeF z adresem kontrahenta spoza Polski zachowuje oba wiersze adresu w oryginale, więc PDF nie składa już np. "New York, NY 10118" w "York, NY 10118 New"; dotyczy faktur pobranych po aktualizacji. Adres korespondencyjny z faktury w KSeF nie nadpisuje już przy tym adresu kontrahenta. Plik SEPA, jak dotąd, nie zawiera adresu odbiorcy: bank go nie wymaga, a adres zapisany wolnym tekstem banki europejskie mają wkrótce odrzucać. Linie przenoszą kopia zapasowa, eksport i import konfiguracji, kopia faktury, korekta i zamiana pro-formy na fakturę. Polecenia `ksefka-cli create-contractor` i `update-contractor` mają flagi `--address-line1` i `--address-line2`, narzędzia MCP `create_contractor` i `update_contractor` przyjmują pola `address_line1` i `address_line2`, a `create_invoice` pola `contractor_address_line1` i `contractor_address_line2`. Zmiana kraju na Polskę przez `update-contractor` albo `update_contractor` bez podania linii czyści zapisane linie. Aplikacja odrzuca wolne linie przy kontrahencie z Polski, drugą linię bez pierwszej i linię dłuższą niż 512 znaków (#1192, #1163, #1194).
Wolne linie adresu także przy podmiocie dodatkowym (Podmiot3) spoza Polski, na fakturze i w szablonie. Przełącznik "Adres w dwóch wolnych liniach" działa jak przy kontrahencie, a linie trafiają do XML-a wysyłanego do KSeF (AdresL1 i AdresL2), na PDF i do podglądu faktury. Kontrahent wybrany z listy jako podmiot dodatkowy przenosi linie razem z resztą adresu, zamiast pustego adresu i ostrzeżenia. Faktura pobrana z KSeF z podmiotem dodatkowym spoza Polski zachowuje oba wiersze jego adresu w oryginale. Linie przenoszą kopia zapasowa, kopia faktury, korekta, zamiana pro-formy na fakturę, zapis jako szablon i import faktury z pliku XML. Obowiązują te same reguły co przy kontrahencie: aplikacja odrzuca linie przy podmiocie z Polski, drugą linię bez pierwszej i linię dłuższą niż 512 znaków (#1288).
Wolne linie adresu także przy adresie własnej firmy spoza Polski (sprzedawca, Podmiot1). W Ustawieniach, w danych firmy, po wybraniu kraju innego niż Polska pojawia się przełącznik "Adres w dwóch wolnych liniach", jak przy kontrahencie. Linie trafiają do XML-a wysyłanego do KSeF (AdresL1 i AdresL2), do bloku sprzedawcy na PDF, do kopii zapasowej i do eksportu konfiguracji; w trybie linii numer budynku, kod pocztowy i miasto firmy nie są wymagane.
Zmienione
Strona /download na ksefka.com jest przygotowana pod kampanię: opis aplikacji (dane lokalnie na dysku, bez abonamentu, PRO jednorazowo), panel SmartScreen z krokami instalacji i sumą SHA-256 pliku do sprawdzenia w PowerShellu, informacja o notaryzacji Apple, sekcje "Wymagania systemowe" i FAQ, a na telefonie zamiast pobierania mail z linkiem do walidatora. Plik `releases.json` zawiera odtąd SHA-256 każdego pliku wydania. Zbiera też jedno zdarzenie pobrania z rodzajem systemu, a baner cookies używa Consent Mode v2 w wersji Basic: zgoda na samą analitykę nie obejmuje pomiaru konwersji Google Ads, więc baner pyta ponownie, a w stopce jest link "Ustawienia cookies" do wycofania zgody (#1247).
`release-local.sh` wznawia nieudane wydanie przez `--continue` i zaczyna od zera przez `--fresh`. Pomija platformy zbudowane z tego samego commita, a build na Windowsie działa jako zadanie na laptopie i przeżywa zerwanie SSH. Do `just check` doszedł strażnik, który wykrywa bajty NUL w plikach źródłowych (#1208, #1258).
Blok "Dodatkowe podmioty (Podmiot3)" w formularzach faktury i szablonu korzysta ze wspólnego schematu walidacji i wspólnych pól, a wolne linie adresu kontrahenta i podmiotu z jednej funkcji payloadu. Zmiana wewnętrzna, wygląd i zachowanie formularzy bez zmian (#1295).
Narzędzie MCP `attach_file` przyjmuje dodatkowe załączniki (kolejny załącznik faktury otrzymanej i każdy załącznik faktury wystawionej) także w trzydniowym okresie próbnym CLI, tak jak narzędzia MCP do pro-form. Dotąd wymagało licencji PRO, więc w okresie próbnym kończyło się błędem "Funkcja PRO:". Zasada jest sprawdzana przy każdym wywołaniu, więc sesja MCP uruchomiona w okresie próbnym traci tę możliwość po jego końcu. Aplikacja desktopowa nadal wymaga licencji PRO do dodatkowych załączników (#1290).
Pro-formy wymagają licencji PRO, jak zapowiadała aplikacja od wersji 0.13.0. Bez licencji przyciski "Nowa pro-forma", "Edytuj" i "Otrzymano wpłatę" otwierają okno z ofertą PRO, a pozycja "Pro-formy" w menu ma odznakę PRO. Pro-formy wystawione wcześniej zostają w aplikacji: można je przeglądać, pobrać jako PDF i anulować. W `ksefka-cli` komendy `proforma` działają z licencją PRO albo w trzydniowym okresie próbnym CLI, jak pozostałe komendy PRO; tę samą zasadę stosują narzędzia MCP do pro-form (#1096).
Poprawione
Pomiar odwiedzin na ksefka.com w Google Analytics znów liczy trafienia: gtag wrzucał do `dataLayer` zwykłą tablicę zamiast obiektu `arguments` (#1231).
Wyszukiwanie na liście faktur nie znika po wejściu w fakturę. Dotąd po otwarciu faktury i powrocie przyciskiem "Wróć do listy" zapytanie w wyszukiwarce (a z nim filtry, które z niego wynikają, np. kontrahent czy daty) było kasowane i lista wracała nieprzefiltrowana. Teraz zapytanie zostaje. Aplikacja czyści je tylko wtedy, gdy zmienisz firmę albo kierunek (wystawione, otrzymane, wszystkie) — także gdy zrobisz to przy otwartej fakturze. Wyjście na inną stronę aplikacji nadal czyści wyszukiwarkę (#1277).
Edycja faktury, której payload nie zawiera pól powiązań (`advance_invoice_ids`, `original_invoice_ids`, `corrected_invoice_refs`), nie kasuje już zapisanych powiązań z fakturami zaliczkowymi, korygowanymi w aplikacji ani faktury korygowanej spoza aplikacji. Dotąd brak pola oznaczał pustą listę, więc taka edycja po cichu usuwała powiązania. Teraz brak klucza zostawia je bez zmian, a `null` lub pusta lista je czyści; zachowane są tylko te powiązania, które typ i kierunek faktury z payloadu nadal przewidują. Formularz w aplikacji zawsze wysyła komplet pól, więc jego zachowanie się nie zmienia (#1280).
Uszkodzony `preferences.json` nie znika już po cichu: przy starcie aplikacja pokazuje komunikat z ścieżką kopii odłożonej obok pliku (`preferences.json.corrupt-<skrót>`) i radą, by wpisać klucz licencji PRO ponownie. Komunikat pojawia się raz, przy uruchomieniu, w którym kopia powstała, i zostaje do zamknięcia (#1299).
Zapis stanu okna, pliku `pending_action.json` (polecenia z CLI dla aplikacji) i `usage.json` jest atomowy tak samo jak zapis `preferences.json`: plik tymczasowy o unikalnej nazwie, synchronizacja z dyskiem i dopiero podmiana pliku (#1294).
Przycisk "Zapisz UPO" w szczegółach faktury pokazuje się tylko wtedy, gdy aplikacja ma zapisaną treść UPO, a nie już na samą datę przyjęcia. Dotąd po przywróceniu kopii zapasowej albo imporcie konfiguracji (data przyjęcia jest, treści nie ma) przycisk był widoczny, a kliknięcie kończyło się komunikatem, że nie ma czego zapisać; link weryfikacji i data przyjęcia zostają bez zmian (#1298).
Zapis pliku `preferences.json` (środowisko KSeF, licencja PRO, okres próbny CLI) jest atomowy. Dotąd plik był zapisywany wprost, więc awaria lub zabicie procesu w trakcie zapisu zostawiały ucięty plik, a ten odczytywał się jak pusty i kasował licencję. Teraz aplikacja zapisuje dane do pliku tymczasowego w tym samym katalogu, synchronizuje go z dyskiem i dopiero wtedy podmienia nim `preferences.json`; po przerwanym zapisie zostaje poprzednia, kompletna wersja. To samo dotyczy kopiowania pliku przy przenoszeniu danych do nowego katalogu (#1291). Uszkodzony plik jest odkładany obok jako `preferences.json.corrupt-<skrót>` zamiast po cichu nadpisywany.
Przywracanie kopii zapasowej i import konfiguracji zachowują u kontrahenta znaczniki JST i grupy VAT oraz język e-maili. Dotąd po przywróceniu wracały wartości domyślne (nie, nie, polski). Kopie sprzed tych pól przywracają się jak dawniej; nieprawidłowa wartość w ręcznie edytowanej kopii nie przerywa przywracania, tylko zamienia się na domyślną z ostrzeżeniem w raporcie (#1289).
Import konfiguracji z nieprawidłowym językiem e-maili kontrahenta (np. ręcznie edytowany plik) nie kończy się już błędem. Aplikacja zamienia go na język domyślny (polski) i pokazuje ostrzeżenie z nazwą kontrahenta, tak jak przy przywracaniu kopii zapasowej. Test przywracania kopii porównuje odtąd wszystkie kolumny kontrahenta, więc nowa kolumna pominięta w przywracaniu zostanie wykryta (#1297, #1293).
Eksport konfiguracji do pliku JSON działa. Zapytanie o kontrahentów pomijało kolumny znaczników JST i grupy VAT oraz języka e-maili, a odczyt kontrahenta wymagał każdej z nich, więc eksport kończył się błędem. Plik z eksportu zawiera teraz pełne dane kontrahentów, w tym wolne linie adresu, które import konfiguracji odtwarza (#1192).
Błąd całego przebiegu faktur cyklicznych w tle (np. baza danych zajęta w chwili pobierania zaległych harmonogramów) jest widoczny w aplikacji. Dotąd aplikacja zapisywała go tylko w logu: zaległe harmonogramy zostawały bez faktury, a użytkownik nie dostawał ani powiadomienia, ani notki na stronie faktur cyklicznych. Lista nieudanych harmonogramów po przebiegu (#1271) obejmuje tylko harmonogramy, do których przebieg w ogóle doszedł. Teraz powiadomienie w rogu okna podaje przyczynę po polsku, rozpoznaną tak samo jak w liście problemów z synchronizacji KSeF (#1239): zajęta baza danych, a przy innych błędach zdanie ogólne z prośbą o zgłoszenie; przycisk "Pokaż na stronie Cykliczne" prowadzi do notki ze szczegółami technicznymi. Nad harmonogramami zostaje notka z tą przyczyną, zwiniętymi szczegółami technicznymi do skopiowania i informacją, że aplikacja ponowi przebieg za godzinę i po ponownym uruchomieniu. Notka i powiadomienie znikają po następnym przebiegu tej firmy, który doszedł do końca, a przełączenie środowiska KSeF czyści je jak listę nieudanych harmonogramów (#1279).
PDF faktury VAT RR, faktury z procedurą marży i faktury uproszczonej (UPR) drukował się z tytułem "FAKTURA VAT", bo te trzy typy wpadały w domyślną gałąź dopasowania tytułu razem ze zwykłą fakturą VAT. Każdy z nich ma teraz własny tytuł ("FAKTURA VAT RR", "FAKTURA VAT MARŻA", "FAKTURA UPROSZCZONA") we wszystkich trzech językach PDF; dopasowanie typu faktury do tytułu jest odtąd wyczerpujące, więc kolejny typ faktury bez przypisanego tytułu nie skompiluje się. Faktura z procedurą marży dodatkowo pokazuje pod tytułem, jaka procedura ma zastosowanie (towary używane, dzieła sztuki, przedmioty kolekcjonerskie i antyki, usługi turystyki); dotyczy to również faktur otrzymanych i zsynchronizowanych z KSeF, bo FA(3) nie ma osobnego kodu rodzaju faktury dla procedury marży (#1178).
Kopiowanie faktury RR lub uproszczonej ("Więcej" → "Utwórz nową na podstawie") nie zamienia dokumentu po cichu w zwykłą fakturę VAT. Lista wyboru typu w formularzu nie oferuje tych dwóch typów — przychodzą wyłącznie z KSeF — więc pole "Typ" wyglądało na puste, a jego dotknięcie bez świadomego wyboru zapisywało dokument jako VAT bez ostrzeżenia. Pole zostaje teraz puste, komunikat obok niego nazywa typ źródłowy ("Faktury typu VAT RR nie da się wystawić ręcznie — wybierz typ nowego dokumentu."), a zapis jest zablokowany, dopóki użytkownik nie wybierze typu ręcznie. Import faktury RR/uproszczonej z pliku XML zachowuje jej typ bez zmian — to zapis dokumentu takiego, jaki naprawdę jest, nie nowe wystawienie. Ten sam warunek chroni "Zapisz jako szablon" wywołane z takiego formularza, edycję istniejącego szablonu z takim typem (`TemplateForm`) oraz samo "Zapisz jako szablon" na szczegółach faktury RR/uproszczonej — ta pozycja menu znika, żeby taki szablon nie powstał wcale (#1182).
Lista dokumentów, których nie udało się pobrać z KSeF, zostaje w aplikacji. Dotąd przyczyny pokazywał tylko toast z trzema pierwszymi pozycjami (dalej "i 7 więcej"), który znikał po kilku sekundach, obok leciał drugi z "Sprawdź logi", a pozycja wyglądała jak "20260801-SE-ABC123-45.xml: Nieznany RodzajFaktury 'UPR'". Przy synchronizacji w tle łatwo było go przeoczyć, a efektem był brakujący dokument w rejestrze zakupów. Teraz nad treścią strony zostaje baner "Nie wszystkie dokumenty z KSeF zostały pobrane", a "Pokaż szczegóły" otwiera pełną listę: numer faktury i kontrahent (także gdy aplikacja nie zdołała odczytać całej faktury), numer KSeF i przyczyna. Lista dzieli pozycje na "Wymaga poprawki w aplikacji" (tego dokumentu ponowna synchronizacja nie pobierze, trzeba zgłosić błąd) i "Do ponowienia" (błąd przejściowy, kolejna synchronizacja spróbuje jeszcze raz). Toast po synchronizacji podaje liczbę problemów z tym podziałem i ma ten sam przycisk. Lista dotyczy ostatniej synchronizacji danej firmy, także tej w tle, i znika po synchronizacji bez błędów; nie trafia do kopii zapasowej (#1179).
Formularz faktury: komunikat "Faktury typu VAT RR nie da się wystawić ręcznie — wybierz typ nowego dokumentu." (kopia faktury RR/uproszczonej, #1182) nie rozjeżdża już wiersza "Dane podstawowe". Wiersz wyrównuje pola do dołu (żeby dymek pomocy przy "Numer faktury" nie przesuwał tego pola względem sąsiednich), a komunikat pod polem "Typ" liczył się do wysokości tej kolumny, więc trzylinijkowy tekst ściągał "Kierunek" i "Numer faktury" o dwie linie niżej niż "Typ". Komunikaty walidacyjne tego wiersza (typ nieciągły, procedura marży, numer faktury) renderują się teraz pod całym wierszem pól zamiast wewnątrz jednej kolumny — etykiety i pola wszystkich trzech kolumn zostają w jednej linii niezależnie od tego, który komunikat się pokazuje (#1238).
Przyczyny w grupie "Do ponowienia" na liście problemów z synchronizacji KSeF są po polsku. Dotąd pozycja pokazywała surowy komunikat techniczny, np. "error returned from database: (code: 5) database is locked" albo "KSeF HTTP error 503: Service Unavailable". Teraz aplikacja rozpoznaje rodzaj błędu i pisze, co się stało: baza danych aplikacji była zajęta, KSeF był chwilowo niedostępny albo nie odpowiedział na czas, aplikacja przekroczyła limit zapytań do KSeF, paczka pobrana z KSeF była uszkodzona; pozostałe błędy opisuje zdanie ogólne. Zakres dat, którego nie udało się pobrać, ma daty w polskim zapisie (01.02.2026–01.05.2026). Surowy komunikat zostaje pod zwiniętym "Szczegóły techniczne", z przyciskiem "Kopiuj", do zgłoszenia błędu. Polskie zdanie dostaje też odrzucenie dokumentu przez bazę danych w grupie "Wymaga poprawki w aplikacji". Lista zapisana przed aktualizacją wyświetla się jak dotąd (#1239).
Przywracanie kopii zapasowej sprawdza podstawę zwolnienia z VAT przy produktach tak samo jak formularz produktu, CLI i MCP. Dotąd produkty z kopii trafiały do katalogu bez kontroli, więc ręcznie edytowany plik mógł zostawić produkt z nieznanym typem podstawy, z podstawą przy stawce innej niż "zw" albo z przepisem bez typu, a produkt bez stawki VAT po cichu dostawał 23%. Teraz produkt z nieznanym typem wraca bez podstawy, a pozycja faktury dodana z takiego produktu bierze podstawę zapamiętaną dla firmy, jeśli firma ją ma. Podstawa przy innej stawce przepada, przepis bez typu dostaje typ "Ustawa o VAT", a produkt bez stawki nadal dostaje 23%. Każdą taką poprawkę aplikacja zgłasza po imporcie jako ostrzeżenie z nazwą produktu: pierwsze pięć na ekranie, kolejne w historii powiadomień, a wszystkie w logu aplikacji; ostrzeżenie o nieznanym typie podaje treść przepisu, żeby dało się go wpisać ponownie. Kopie sprzed podstawy przy produkcie przywracają się jak dotąd, bez ostrzeżeń (#1245).
Przypisanie nazwy do profilu (Ustawienia → Firmy → "Rozdzielanie firm po nazwie") pokazuje, które dokumenty zostały w kolejce i dlaczego. Dotąd toast podawał samą liczbę ("2 nie powiodło się i pozostaje w kolejce do ponowienia"), a przyczyna trafiała tylko do logu. Teraz toast ma przycisk "Pokaż szczegóły", a pod przełącznikiem zostaje notka z tym samym przyciskiem, także po zniknięciu toastu. Lista wygląda jak lista problemów z synchronizacji KSeF: numer faktury, kontrahent, numer KSeF i przyczyna, w podziale na "Wymaga poprawki w aplikacji" (np. faktura, której aplikacja nie potrafi odczytać) i "Do ponowienia" (np. chwilowo zajęta baza danych; pomaga ponowne kliknięcie "Przypisz"). Lista dotyczy ostatniego przypisania i znika przy następnym albo po wyjściu z ustawień; dokumenty z listy czekają w kolejce (#1240).
"Zapisz jako szablon" znika przy fakturze rozliczeniowej (końcowej), korekcie rozliczeniowej i korekcie zaliczkowej. Szablon tych typów nie obsługuje: faktura rozliczeniowa wskazuje rozliczane faktury zaliczkowe, korekta wskazuje fakturę korygowaną, a szablon nie przechowuje powiązań z konkretnymi dokumentami. Dotąd pozycja była w menu "Więcej" w szczegółach faktury i w stopce formularza faktury, a utworzony nią szablon otwierał się z pustym polem "Typ" i nie przechodził zapisu bez zmiany typu. Formularz faktury chowa przycisk po wyborze takiego typu i pokazuje go znowu po powrocie do typu, który szablon obsługuje. Wcześniej zapisany szablon z takim typem, np. przywrócony z kopii zapasowej, pozostaje edytowalny (#1241).
Faktura, której XML-a aplikacja nie odczytała przy jednorazowym uzupełnianiu danych po aktualizacji, dostaje drugą szansę w następnej wersji. Takie uzupełnianie dopisuje zapisanym fakturom dane z ich XML-a: opis i formę płatności, numer zamówienia, kwoty pozycji. Dotąd faktura z nieodczytanym XML-em zostawała bez tych danych na stałe, bo aplikacja oznaczała uzupełnianie jako zakończone. Teraz zapamiętuje takie faktury razem z numerem wersji, a każda nowsza wersja przy pierwszym uruchomieniu próbuje odczytać je ponownie: tylko te faktury i tylko raz. Zamiast ostrzeżenia o każdej fakturze log dostaje przy takim ponowieniu jedną linię podsumowania na każde uzupełnianie. Pierwsze uruchomienie tej wersji powtarza uzupełnianie opisu i formy płatności, żeby zapamiętać faktury nieodczytane wcześniej. Uzupełnianie kwot pozycji nie próbuje już odczytać takiej faktury przy każdym starcie aplikacji (#1256).
Przywracanie kopii zapasowej zgłasza każdą wartość, którą musiało zastąpić domyślną. Dotąd ręcznie edytowany albo uszkodzony plik kopii przechodził bez słowa: produkt bez ceny dostawał cenę 0, bez waluty PLN, a bez znacznika aktywności stawał się aktywny. Tak samo działały szablony faktur (waluta, typ faktury, flagi), ich podmioty dodatkowe (kraj "PL", rodzaj identyfikatora "NIP") i faktury cykliczne (okres, dzień miesiąca, status, tryb). Szablon bez listy pozycji zapisywał się tak, że potem nie otwierała się lista szablonów ani nie udawała się kolejna kopia; teraz szablon i faktura cykliczna wracają z pustą listą pozycji, a pozycja, której nie da się odczytać (np. bez nazwy albo ceny), wypada z listy zamiast ją blokować. Faktura cykliczna w trybie "Gotowa do wysyłki", której pozycje nie wróciły w całości, przywraca się jako szkic, żeby kolejna faktura nie poszła bez tych pozycji. Wartość złego typu w polu opcjonalnym (np. liczba w polu jednostki) zostaje pustym polem, a faktura cykliczna z interwałem mniejszym niż 1 albo dniem miesiąca spoza 1–31 dostaje wartość domyślną. Każda taka zamiana trafia do ostrzeżeń po imporcie, razem z nieprawidłowym kontekstem IDWew, nieprawidłowym terminem płatności szablonu i zmianą kontekstu uwierzytelniania KSeF, które dotąd zapisywały się tylko w logu. Załącznik, którego nie udało się zapisać na dysku, też jest ostrzeżeniem: dotąd import kończył się wtedy błędem, choć dane były już przywrócone. Ostrzeżenia o tym samym polu i tym samym problemie łączą się w jedno, z nazwami do pięciu pozycji i liczbą pozostałych, więc duża kopia nie zasypuje ekranu. Kopie ze starszych wersji, w których danego pola jeszcze nie było, przywracają się bez ostrzeżeń; wyjątkiem jest zmiana kontekstu uwierzytelniania KSeF, którą aplikacja zgłasza zawsze (#1259).
"Zapisz jako szablon" znika także przy korekcie VAT. Korekta w KSeF musi wskazać fakturę korygowaną, a szablon jej nie przechowuje. Faktura z szablonu korekty startowała więc bez niej, a zapis kończył się odmową "Faktura korygująca wymaga wskazania przynajmniej jednej faktury korygowanej", widoczną tylko jako powiadomienie w rogu okna. Aplikacja nie tworzy już szablonu korekty i nie zmienia typu istniejącego szablonu na korektę. Szablony korekty zapisane wcześniej działają dalej: faktura z takiego szablonu otwiera się jako korekta z polem wyboru faktury korygowanej, a formularz szablonu przed zapisem zmian prosi o wybór innego typu. Polecenie `ksefka-cli create-invoice --from-template` z szablonem korekty (VAT, zaliczkowej albo rozliczeniowej) lub faktury rozliczeniowej wymaga teraz flagi `--draft`, która otwiera szkic w aplikacji; bez niej polecenie kończyło się tą samą odmową zapisu, bez wskazówki, że szkic da się dokończyć w aplikacji (#1257).
Faktura cykliczna nie powstaje już z korekty ani z faktury rozliczeniowej. Korekta wskazuje fakturę korygowaną, a faktura rozliczeniowa — rozliczane faktury zaliczkowe; harmonogram nie przechowuje powiązań z konkretnymi dokumentami, więc generował dokumenty bez nich. Szkic takiej faktury przechodził zapis, a w trybie "Gotowa do wysyłki" trafiał do kolejki i padał dopiero przy budowie XML, bez udziału użytkownika. Pozycja "Utwórz cykliczną" znika z menu "Więcej" przy tych typach, a także przy fakturze RR i uproszczonej, których aplikacja nie wystawia; narzędzie MCP `create_recurring_from_invoice` odmawia z tym samym powodem. Harmonogram z takim typem zapisany wcześniej albo przywrócony z kopii zapasowej zostaje, ale nie wygeneruje faktury: przy najbliższym terminie aplikacja wstrzymuje go i zgłasza powód tak jak każdy inny błąd generowania, "Generuj teraz" i "Wznów" są dla niego w aplikacji niedostępne (CLI i MCP zwracają ten sam powód jako błąd), na liście ma przy nazwie znacznik z powodem, a szczegóły harmonogramu pokazują ostrzeżenie z nazwą typu i radą, żeby usunąć go i utworzyć nowy na podstawie faktury VAT, zaliczkowej albo z procedurą marży. Pozostałe pola takiego harmonogramu nadal można edytować (#1262).
Ostrzeżenia po przywróceniu kopii zapasowej nazywają pola po polsku. Dotąd cytowały nazwy z pliku i zapis techniczny: `pole "payment_days" w kopii ma nieprawidłową wartość`, `brakuje pola "line_items", aplikacja przyjęła []`, `pole "currency_code" w kopii jest puste, aplikacja przyjęła "PLN"`. Teraz ostrzeżenie brzmi np. `pole "waluta" (currency_code) w kopii jest puste, aplikacja przyjęła PLN` albo `w kopii brakuje pola "pozycje faktury" (line_items), aplikacja przywróciła szablon bez pozycji`; nazwa z pliku zostaje w nawiasie, żeby przy ręcznie edytowanej kopii dało się pole odszukać. Kwota ma walutę produktu ("0 zł", "0 EUR"), flaga to "tak" albo "nie", a tryb, interwał i status faktury cyklicznej mają nazwy z aplikacji ("Szkic", "Miesięczny", "Aktywna"). Nieprawidłowa wartość z kopii stoi przy nazwie rekordu jako "w kopii: …", żeby nie myliła się z wartością przyjętą. Ostrzeżenia o stawce VAT i podstawie zwolnienia produktu (#1245) nazywają pola tak samo: etykieta i klucz w nawiasie. Pozycja szablonu pominięta z braku pola podaje polską nazwę tego pola, a pominięta z innego powodu dostaje polskie zdanie ze szczegółem technicznym w nawiasie zamiast samego komunikatu z biblioteki. Etykiety są w jednym słowniku, a test pilnuje, żeby każde pole czytane literałem w kodzie przywracania miało etykietę (#1272).
Formularz korekty wystawianej przez firmę (VAT, zaliczkowej i rozliczeniowej) sprawdza przed zapisem, czy użytkownik wskazał fakturę korygowaną. KSeF wymaga danych faktury korygowanej przy każdej korekcie (element DaneFaKorygowanej w FA(3)), więc takiego dokumentu nie przyjmie. Dotąd formularz pozwalał kliknąć zapis z pustym polem "Korygowane faktury", a odmowę zgłaszał dopiero sam zapis, jako powiadomienie "Faktura korygująca wymaga wskazania przynajmniej jednej faktury korygowanej", bez wskazania pola. Teraz komunikat pojawia się od razu pod listą "Korygowane faktury", a zaznaczenie faktury chowa go bez kolejnej próby zapisu. Powiązanie sprawdzają też zatwierdzenie do wysyłki ("Zatwierdź do wysyłki", `ksefka-cli finalize-invoice`, narzędzie MCP `finalize_invoice`) i wysyłka ręczna: korekta bez faktury korygowanej, np. z ręcznie zmienionej kopii zapasowej, dotąd przechodziła zatwierdzenie i zatrzymywała się dopiero na budowaniu XML-a przy wysyłce (w tle albo ręcznej) z błędem technicznym "Faktura korygująca wymaga przynajmniej jednej referencji do faktury korygowanej (DaneFaKorygowanej)"; teraz zostaje w dotychczasowym statusie, a komunikat podaje numer faktury i mówi, co zrobić. Korekta otrzymana, wpisywana ręcznie, nie ma tego wymogu w formularzu (#1261).
Dokument z kolejki "Do wysłania", którego nie da się zbudować do wysyłki, wraca do szkicu z podaną przyczyną zamiast wisieć w kolejce. Dotąd nadawca w tle próbował po każdej synchronizacji wysłać np. korektę bez faktury korygowanej (zastaną w kolejce sprzed poprawki #1261 albo przywróconą z ręcznie zmienionej kopii zapasowej), budowa XML-a odrzucała ją błędem technicznym "DaneFaKorygowanej", a użytkownik widział tylko wpis w logu: dokument zostawał w "Do wysłania" bez widocznej przyczyny i bez możliwości poprawy, bo pozycji w kolejce nie da się edytować. Teraz nadawca sprawdza dokument przed wysyłką, bez połączenia z KSeF: korektę bez faktury korygowanej, dokument bez pozycji albo bez kontrahenta i każdy inny, który odrzuca builder FA(3), cofa do szkicu i zapisuje przyczynę przy dokumencie. Powiadomienie podaje numer faktury i przyczynę (przy korekcie: "otwórz ją do edycji i wybierz fakturę w polu Korygowane faktury"), na liście faktur taki szkic ma znacznik z przyczyną w dymku, a szczegóły pokazują ją pod nagłówkiem "Dokument wrócił do szkicu". Błędy przejściowe (brak sieci, limit zapytań, awaria KSeF, zajęta baza danych) działają jak dotąd: dokument zostaje w kolejce i jest ponawiany. Niekompletny profil firmy (brak kraju albo adresu sprzedawcy) też nie cofa dokumentów do szkicu: to wada ustawień, nie dokumentu, więc kolejka czeka, aż użytkownik uzupełni dane firmy. Przy starcie aplikacji i zmianie środowiska aplikacja raz sprawdza kolejkę i cofa do szkicu zastane korekty bez faktury korygowanej, z tym samym powiadomieniem. Edycja takiego szkicu albo ponowne zatwierdzenie do wysyłki czyści zapisaną przyczynę; dotąd przyczyna z przerwanej wysyłki zostawała przy dokumencie także po jego poprawieniu (#1270).
Korekta otrzymana wpisywana ręcznie zapisuje się. Dotąd formularz przepuszczał taką korektę bez wskazania faktury korygowanej (nabywca nie wystawia jej w KSeF), ale zapis kończył się odmową "Faktura korygująca wymaga wskazania przynajmniej jednej faktury korygowanej", a wybór faktury otrzymanej z listy "Korygowane faktury" odmową, że tylko faktury wystawione mogą być korygowane. Korekty od kontrahenta nie dało się więc dodać ręcznie wcale. Wymóg wskazania faktury korygowanej dotyczy teraz tylko korekty wystawianej. Korekta otrzymana może nie wskazać niczego, wskazać z listy fakturę otrzymaną pobraną z KSeF albo dostać fakturę spoza aplikacji w nowych polach pod listą: numer, datę wystawienia i opcjonalnie numer KSeF, przepisane z dokumentu od kontrahenta (te same dane, które FA(3) nazywa DaneFaKorygowanej). Taki wpis aplikacja zapisuje i pokazuje w szczegółach, na PDF i w kopii zapasowej tak samo jak korektę pobraną z KSeF, której oryginału nie ma w aplikacji; edycja korekty go zachowuje. Import korekty otrzymanej z pliku XML, gdy korygowanej faktury nie ma w aplikacji, przepisuje jej dane z XML do tych pól zamiast zostawiać samo ostrzeżenie; dopasowanie korygowanej faktury szuka przy tym wyłącznie faktur o kierunku korekty, więc korekta od dostawcy nie trafia już we własną fakturę wystawioną o tym samym numerze; numer faktury otrzymanej dopasowuje się razem z datą wystawienia, a gdy pasuje kilka faktur, aplikacja niczego nie zgaduje i prosi o wskazanie ręcznie. Polecenie `ksefka-cli create-invoice --from-json` i narzędzie MCP `create_invoice` przyjmują to samo pole `corrected_invoice_refs` i nie wymagają `original_invoice_ids` dla korekty otrzymanej (#1269).
Przebieg faktur cyklicznych w tle (po uruchomieniu aplikacji i co godzinę) zgłasza każdy harmonogram, który został bez faktury. Dotąd powiadomienie pokazywało tylko pierwszy błąd, więc przy kilku wstrzymanych harmonogramach (np. kilku z typem korekty po #1262) użytkownik widział jeden powód. Gdy któryś harmonogram został bez faktury, powiadomienie podaje liczbę wygenerowanych faktur i liczbę harmonogramów bez faktury, a "Pokaż szczegóły" otwiera listę z nazwą każdego z nich i powodem; ta sama lista zostaje nad listą faktur cyklicznych, osobno dla każdej firmy, do następnego przebiegu tej firmy (także takiego bez zaległych harmonogramów) albo do zamknięcia aplikacji, a przebieg bez błędów zamyka też to powiadomienie. Komunikat błędu nie zaczyna się już od nazwy harmonogramu, bo nazwę niesie osobno sam wynik. Polecenie `ksefka-cli process-recurring` kończy się kodem wyjścia 3, gdy choć jeden harmonogram został bez faktury (dotąd 0, a błędy były tylko w `data`, więc skrypt w cronie ich nie widział; skrypt z `set -e` przerwie się w tym miejscu): wynik każdego harmonogramu zostaje na stdout w `data`, obok są liczniki `generated_count` i `failed_count`, a podsumowanie z listą nieudanych harmonogramów idzie na stderr; kod 1 nadal oznacza polecenie, które nie wykonało pracy, a kod 2 błędne wywołanie (nieznana flaga, brak argumentu). Narzędzie MCP `process_recurring` zwraca flagę `ok` i osobne listy `generated` i `failed` (z nazwą harmonogramu i powodem) zamiast jednej tablicy z `error` w elementach; wynik jest błędem tylko wtedy, gdy nie powstała żadna faktura, a choć jeden harmonogram został bez faktury (#1271).
Dokumenty w kolejce "Do wysłania", których nadawca w tle nie może zbudować z winy danych firmy, przestają wisieć bez wyjaśnienia. Dotąd niepełny profil sprzedawcy (np. brak miasta albo kodu pocztowego w danych firmy) albo nieczytelny wiersz firmy w bazie zostawiał dokument w kolejce z samym wpisem w logu i liczbą w powiadomieniu "nie udało się wysłać", a przebieg po każdej synchronizacji powtarzał to bez końca. Teraz taki przebieg zapisuje przy firmie przyczynę z radą, co uzupełnić, a nad treścią strony zostaje baner z tą przyczyną i przyciskiem "Otwórz dane firmy"; szczegóły dokumentu w kolejce pokazują ją pod nagłówkiem "Wysyłka wstrzymana", a nowa blokada dostaje też powiadomienie. Dokumenty zostają w kolejce: po uzupełnieniu danych wysyłka rusza sama przy następnej synchronizacji z KSeF, a baner znika, gdy przebieg potwierdzi poprawne dane firmy (sprawdza je na końcu, także gdy żaden dokument ich nie potrzebował) albo gdy kolejka jest pusta. Przebieg przerwany (awaria KSeF, zmiana środowiska) baneru nie zmienia. Powiadomienie po przebiegu z liczbą dokumentów, których nie udało się wysłać, zostaje jak dotąd. Błędy przejściowe (zajęta baza danych) działają jak dotąd, bez banera. Blokada zostaje po restarcie aplikacji, nie trafia do kopii zapasowej, a przywrócenie kopii ją czyści (#1278).Dodane
Domyślny termin płatności w szablonie faktury. Formularz szablonu dostaje pole "Termin płatności (dni)", domyślnie do 120 dni. Granicę zmienia ustawienie "Maksymalny termin płatności w szablonie" w Ustawienia → Faktury, bez górnej granicy; obniżenie granicy nie blokuje edycji zapisanych szablonów z dłuższym terminem. Faktura wystawiona z takiego szablonu startuje z terminem równym dacie wystawienia powiększonej o tę liczbę dni, więc przy stałym terminie u kontrahenta (7, 14, 30 dni) nie trzeba go wyliczać przy każdej fakturze. Termin liczy się raz, przy otwarciu formularza, i pozostaje zwykłym polem: zmiana na fakturze nie zmienia szablonu, a późniejsza zmiana daty wystawienia nie przelicza terminu. "Zapisz jako szablon" z formularza i z podglądu faktury przenosi termin jako liczbę dni między datą wystawienia a terminem tej faktury. Termin wcześniejszy niż data wystawienia albo dłuższy niż granica z ustawień nie przechodzi do szablonu, o czym aplikacja uprzedza ostrzeżeniem. Termin z szablonu dostaje też faktura tworzona przez CLI, a kopia zapasowa go przenosi. Szablony sprzed tej wersji działają jak dotąd, bez terminu (#1197).
Forma płatności "Inne" i pozycje innej metody płatności (PayPal, Revolut, Wise) w szablonach faktur i fakturach cyklicznych. Dotąd szablon nie oferował "Inne", a wybór pozycji PayPal kończył się błędem "Szablon nie może wskazywać innej metody płatności", bo szablon nie miał gdzie trzymać opisu płatności wymaganego przez KSeF przy tej formie. Formularz szablonu dostaje pole "Opis płatności", które działa jak na fakturze: po wybraniu pozycji PayPal forma sama przełącza się na "Inne", a opis podpowiada się z nazwy i identyfikatora pozycji. Podpowiedziany opis nie jest utrwalany w szablonie, więc zmiana adresu PayPal w Kontach bankowych przechodzi na kolejne faktury; opis wpisany ręcznie zostaje. Harmonogram faktury cyklicznej dziedziczy formę i opis z faktury źródłowej i pokazuje je w szczegółach. Zapis szablonu z "Inne" bez opisu i bez pozycji innej metody kończy się komunikatem zamiast szablonem, z którego nie da się wystawić faktury. Faktura z formą "Inne" daje się teraz zapisać jako szablon i zamienić na fakturę cykliczną. Kopia zapasowa przenosi opis płatności obu rodzajów, a przy przywracaniu harmonogramu ustawienie "Użyj IBAN" wraca z własnego pola, a nie z pola metody kasowej, jak dotąd przez pomyłkę. Harmonogram sprzed wersji 0.15 z formą "Inne" bez opisu i bez pozycji innej metody wraca przy pierwszym uruchomieniu do przelewu, żeby generowanie nie zatrzymywało się na dokumencie, którego nie da się poprawić z widoku harmonogramu (#1220, #1219).
Pole "Data zapłaty" na fakturze wystawianej. Po zaznaczeniu "Zapłacono" pojawia się data zapłaty, domyślnie równa dacie wystawienia, do zmiany; skasowana data blokuje zapis z komunikatem zamiast po cichu wracać do daty wystawienia. Faktury zapłacone sprzed tej wersji pokazują w edycji datę wystawienia. Schemat FA(3) wymaga daty zapłaty przy fakturze oznaczonej jako opłacona; dotąd aplikacja wpisywała do KSeF datę wystawienia, więc faktura wystawiona po otrzymaniu wpłaty niosła nieprawdziwą datę. Edycja szkicu zachowuje datę zapłaty (dotąd jej nie zapisywała), a podgląd faktury pokazuje ją jak dotąd (#1222, #1219).
Ustawienie "Domyślnie zapłacona" w szablonie faktury. Faktura wystawiona z takiego szablonu startuje z zaznaczonym "Zapłacono" i datą zapłaty równą dacie wystawienia, bez ręcznego zaznaczania przy każdej fakturze wystawianej po otrzymaniu wpłaty. Ustawienie zapisuje też "Zapisz jako szablon" z formularza faktury, przenosi je kopia zapasowa, a faktura tworzona z szablonu przez CLI dostaje je razem z datą zapłaty równą dacie wystawienia (#1221, #1219).
Kod weryfikacyjny i link "Weryfikacja faktury w KSeF" dla faktur otrzymanych i dla faktur wystawionych poza KSeFką. Dotąd aplikacja zapisywała je tylko z UPO pobranego przy własnej wysyłce, więc faktura od kontrahenta albo wystawiona stroną Ministerstwa Finansów pokazywała "Dane UPO niedostępne" i nie dawała się sprawdzić jednym kliknięciem. KSeF wyznacza kod ze skrótu treści faktury, którą aplikacja już ma po synchronizacji, więc kod i link są teraz liczone lokalnie, bez zapytań do KSeF, także dla faktur zsynchronizowanych wcześniej (uzupełnianie przy każdym uruchomieniu i zmianie środowiska, więc obejmuje też przywróconą kopię zapasową). Faktura przyjęta przez KSeF, dla której nie udało się pobrać UPO tuż po wysyłce, dostaje kod i link od razu z wysłanego XML-a. Wartości z UPO mają pierwszeństwo. Skutek uboczny: PDF takiej faktury drukuje kod QR KSeF, numer KSeF i kod weryfikacyjny, tak jak faktura wysłana z aplikacji (#1196). Komunikat "Dane UPO niedostępne" pojawia się tylko przy fakturze wystawionej bez daty przyjęcia UPO i mówi, że UPO jest w narzędziu, którym fakturę wysłano; faktura otrzymana nie pokazuje go wcale, bo nabywca nie ma dostępu do UPO wystawcy. Samo UPO (data przyjęcia, podpis) dla faktur wysłanych poza aplikacją pozostaje osobną zmianą (#1204).
Poprawione
Kontrahent i firma z miejscowości bez nazw ulic. Wyszukiwarka po NIP zwraca dla wsi adres bez ulicy (np. "Chotel Czerwony 147A, 28-160 Chotel Czerwony"), a aplikacja wymagała ulicy, więc przed zapisem kontrahenta i wystawieniem faktury trzeba było wpisać ulicę, której nie ma. Ulica jest teraz opcjonalna w danych kontrahenta, firmy i podmiotu trzeciego; kontrahent i firma nadal wymagają numeru budynku i miejscowości. Gdy ulicy brak, pierwsza linia adresu w XML-u dla KSeF, na PDF, w pliku przelewów i w podglądzie faktury to "miejscowość numer", jak adresuje Poczta Polska (#1229).
Podsumowanie kwotowe na pulpicie sumuje fakturę pierwotną i jej korektę. Dotąd przy korekcie z typem "w dacie pierwotnej" lub "w innej dacie" aplikacja wycinała fakturę pierwotną z sumy i zostawiała samą kwotę korekty, więc po korekcie -850 EUR do faktury na 1631 EUR pulpit pokazywał -850 EUR zamiast +781 EUR. Reguła zakładała, że taka korekta niesie pełne kwoty po korekcie; od wersji z pozycjami "przed korektą / po korekcie" każda korekta niesie różnicę, a typ korekty w FA(3) mówi tylko o okresie ujęcia w ewidencji. Suma za miesiąc to teraz faktura pierwotna plus różnica z korekty, w każdej walucie i po obu stronach (#1214, #1213).
Korekta wystawiana z podglądu faktury ("Więcej" → "Wystaw korektę") dostaje datę sprzedaży z faktury pierwotnej zamiast dzisiejszej. Data sprzedaży to data dostawy towaru lub wykonania usługi, a ta nastąpiła w dacie z dokumentu pierwotnego, nie w dniu korekty; gdy faktura pierwotna nie ma daty sprzedaży, korekta bierze jej datę wystawienia. Pole pozostaje edytowalne. Wybór faktury pierwotnej w formularzu korekty przepisuje datę sprzedaży tak samo. Przy ustawieniu "miesiąc według daty sprzedaży" korekta trafia dzięki temu do okresu faktury pierwotnej, o ile faktura pierwotna ma datę sprzedaży; okres dostawy faktury rozliczanej okresem nie jest przenoszony (#1215, #1213).
Korekta wystawiana z podglądu faktury przepisuje kurs waluty z faktury pierwotnej (art. 31b ustawy o VAT). Dotąd taki draft startował bez kursu i formularz pobierał kurs NBP według daty korekty, więc korekta w EUR szła do KSeF z innym kursem niż faktura pierwotna; przepisywanie kursu działało tylko przy wyborze faktury pierwotnej z listy w formularzu. Formularz pokazuje informację "Kurs przepisany z faktury pierwotnej (art. 31b VAT)" i nie pobiera nowego kursu po zmianie daty; ręczna zmiana kursu nadal jest możliwa. Po odznaczeniu faktury pierwotnej w formularzu odziedziczony kurs jest czyszczony i pobierany na nowo, a błąd pobrania danych jednej z kilku korygowanych faktur cofa wybór do poprzedniego stanu zamiast zostawiać część danych (#1216, #1213).
Odmowa KSeF (HTTP 429) przy pobieraniu UPO tuż po przyjęciu faktury jest traktowana jak każda inna blokada limitu: aplikacja zapamiętuje czas oczekiwania i pokazuje go w ostrzeżeniu, zamiast surowego błędu HTTP. Faktura pozostaje przyjęta z numerem KSeF, a synchronizacja nie odpytuje KSeF do końca odczekiwania (#1202, #1204).Poprawione
Synchronizacja z KSeF zatrzymuje się po przekroczeniu limitu zapytań. Po odpowiedzi HTTP 429 aplikacja próbowała dalej: kolejne podmioty, kolejne okna synchronizacji wstecz. Jedno przekroczenie limitu zamieniało się w serię kolejnych, a blokada rosła z każdą próbą. Aplikacja honoruje teraz czas oczekiwania zwrócony przez KSeF: po pierwszym 429 przerywa bieżącą synchronizację, nie wysyła kolejnych zapytań do końca odczekiwania i pokazuje komunikat z liczbą minut do następnej próby zamiast surowego błędu technicznego. Dotyczy synchronizacji ręcznej, automatycznej, synchronizacji po przełączeniu firmy i "Pobierz starsze faktury" (#1202, #1199).
Automat synchronizacji nie oferuje już interwału "Co 5 minut" w Ustawieniach. Przy limicie KSeF (20 eksportów na godzinę) sam potrafił doprowadzić do blokady. Zapisane wcześniej wartości poniżej 15 minut są traktowane jak 15 minut, zarówno przy odczycie, jak i przy zapisie ustawień (#1202).
Produkt z katalogu wchodzi na miejsce pustego wiersza, a nie obok niego. Nowa faktura startuje z jednym pustym wierszem pozycji, a wybór "Z katalogu" dopisywał produkt jako drugą pozycję; pusty pierwszy wiersz zostawał i zapis kończył się błędem "Nazwa jest wymagana", dopóki nie skasowało się go ręcznie. Teraz produkt zastępuje pierwszy wiersz, w którym nie ma jeszcze nazwy, ceny, rabatu, opisu ani kodów; wiersz z którąkolwiek z tych wartości zostaje, a produkt staje za nim. Sama zmiana ilości, jednostki lub stawki w pustym wierszu go nie chroni, bo produkt z katalogu niesie własne. Faktura złożona wyłącznie z produktów katalogu zapisuje się bez ręcznego porządkowania pozycji (#1201).
Dodane
Podstawa zwolnienia z VAT zapisywana przy produkcie w katalogu. Przy stawce zw. formularz produktu pokazuje typ podstawy (ustawa o VAT, dyrektywa UE, inne) i pole przepisu z podpowiedziami. Produkt dodany z katalogu wnosi na fakturę własną podstawę; dotąd każda pozycja zw. dostawała podstawę użytą ostatnio w firmie, co przy kilku różnych zwolnieniach (art. 113 ust. 1, art. 43 ust. 1 pkt 19, art. 43 ust. 1 pkt 29) wymagało ręcznej poprawki. Produkt bez zapisanej podstawy nadal dostaje ostatnio użytą; zmiana stawki produktu na inną niż zw. usuwa zapisaną podstawę (#1200).Poprawione
Etykieta stawki "n.p. (poza terytorium kraju)" nie nachodzi już na kwotę VAT w tabeli pozycji podglądu faktury. Kolumna stawki ma domyślnie 48 px, a pełna nazwa stawki zagranicznej się w niej nie mieściła i wylewała się na sąsiednią kolumnę, przykrywając liczbę; dotyczyło większości stawek zagranicznych dodanych w 0.14.0, "n.p." było tylko najbardziej widoczne. W wąskich kolumnach (pozycje faktury, podsumowanie VAT, lista produktów) stoi teraz krótka etykieta, taka sama jak na PDF ("n.p.", "o.o.", "0% WDT"), a pełna nazwa pokazuje się po najechaniu; listy wyboru dalej pokazują pełne nazwy. Domyślna szerokość kolumny stawki rośnie do 100 px. Kto przeciągał kiedyś krawędzie kolumn, ma starą szerokość zapisaną na dysku i sama zmiana domyślnej wartości by go nie objęła, więc zapisane 48 px jest jednorazowo podnoszone do 100 px przy pierwszym uruchomieniu; własne szerokości pozostałych kolumn zostają bez zmian (#1162).
Dla pro-formy nie da się już wygenerować pliku XML w formacie FA(3). Akcja generowania XML sprawdzała tylko status dokumentu, a pro-forma wygląda dla niej jak zwykły szkic, więc dostawała poprawny plik faktury ustrukturyzowanej i zapisywała go u siebie, nieodróżnialny od XML-a pobranego z KSeF. Taki plik, wysłany ręcznie albo przekazany księgowej, mógłby uchodzić za fakturę. Pro-forma jest dokumentem poza KSeF: próba wygenerowania XML kończy się teraz komunikatem odsyłającym do akcji "Otrzymano wpłatę", a już zapisany plik nie jest ruszany. W aplikacji przycisk generowania XML nie był dostępny z ekranu pro-formy, więc zmiana domyka drogę przez CLI, MCP i przyszłe ekrany. Pro-formy, które dostały XML przed tą wersją, nadal go przechowują; ewentualna korekta tych danych będzie osobną zmianą (#1143).
Adresy zagraniczne na PDF drukują się w porządku przyjętym w kraju odbiorcy. Aplikacja składa adres z osobnych pól ulicy, numeru budynku i lokalu. Dotąd robiła to jednakowo dla całego świata, więc kontrahent z USA dostawał "Main Street 123/12" zamiast "123 Main Street, Apt 12". Kolejność członów zależy teraz od kraju adresu: w krajach anglojęzycznych i w Chinach numer stoi przed ulicą, a kod pocztowy za miastem; we Francji, Monako i Luksemburgu numer stoi przed ulicą przy kodzie przed miastem. Numer lokalu wpisany jako sama liczba dostaje słowo przyjęte w danym kraju ("Apt", "Flat", "Unit", "Appt"), a wpisany z własnym opisem ("Ste 500") zostaje bez zmian. O kolejności decyduje kraj adresu, więc adres polskiego sprzedawcy wygląda tak samo na fakturze po angielsku jak po polsku, a faktura wyłącznie z polskimi adresami zachowuje dotychczasową kolejność członów. Adres z pustym polem drukuje się przy okazji bez zbędnej spacji, która zostawała po sklejaniu. Gdy którakolwiek strona faktury jest spoza Polski, pod każdym adresem pojawia się nazwa kraju; wcześniej faktura nie podawała kraju nigdzie, więc odbiorca za granicą nie znajdował na dokumencie informacji, gdzie ma siedzibę sprzedawca. Plik XML wysyłany do KSeF zachowuje dotychczasową kolejność, bo z niej aplikacja odczytuje adres z powrotem przy synchronizacji. Adresy, których nie da się złożyć z pól ulicy, numeru i lokalu, na przykład chińskie z dzielnicą i prowincją, będą osobną zmianą (#1163).
Faktury uproszczone (paragon z NIP-em do 450 zł) przestają znikać przy synchronizacji. Kontrahent może wystawić taki dokument i KSeF go przyjmuje, ale aplikacja nie znała tego rodzaju faktury i po cichu pomijała go przy pobieraniu — w rejestrze zakupów brakowało dokumentu, a jedynym śladem było ostrzeżenie o nieudanych fakturach, powtarzane przy każdej kolejnej synchronizacji. Takie faktury wczytują się teraz jako osobny typ "Uproszczona" i nie są podmieniane na zwykłą fakturę VAT. Wystawianie faktury uproszczonej z aplikacji będzie osobną zmianą. Przy okazji typ faktury przestał wyświetlać się jako surowy kod ("VAT_CORRECTING", "RR") na szczegółach faktury i faktury cyklicznej — jest tam teraz czytelna nazwa (#1176).
Jedna faktura, której aplikacja nie umie odczytać, nie zabiera już widoku całej listy. Wystarczyło, że w bazie znalazła się wartość spoza tego, co zna uruchomiona wersja programu — na przykład po cofnięciu się do wcześniejszego wydania — i lista faktur robiła się pusta, mimo że wszystkie dokumenty były na miejscu. Taki wiersz zostaje teraz na liście z numerem, datą, kontrahentem i kwotą, oznaczony ostrzeżeniem, które podaje, czego nie dało się odczytać; nie da się go tylko zaznaczyć do akcji masowych i jego szczegóły nadal zgłoszą błąd. To samo dotyczy list pro-form i faktur cyklicznych (#1181).
Faktura z formą płatności "Kompensata" przechodzi wysyłkę do KSeF. Aplikacja wysyłała ją z kodem 9, którego słownik FA(3) nie zna, więc KSeF odrzucał każdą taką fakturę błędem 450 "Błąd weryfikacji semantyki dokumentu". Kompensata jedzie teraz tak, jak przewiduje schemat — jako "inna forma płatności" z opisem "Kompensata" — i w tej samej postaci jest rozpoznawana na fakturach otrzymanych, więc kompensata wystawiona i odebrana wyglądają w aplikacji identycznie. Forma "Inne" nie jest już wysyłana do KSeF jako przelew: ma obowiązkowe pole "Opis płatności", które trafia do dokumentu (#1132).
Dodane
Inne metody płatności obok rachunków bankowych: w sekcji "Konta bankowe" można dodać pozycję typu PayPal, Revolut, Wise czy ACH, podając własną nazwę metody, identyfikator (adres e-mail, tag, numer konta w danym systemie) i opcjonalny opis, bez listy z góry ustalonych marek. Taką pozycję wybiera się na fakturze tym samym selektorem co rachunek. Na PDF (po polsku, angielsku i niemiecku) zamiast numeru rachunku, IBAN i SWIFT drukuje się nazwa metody z identyfikatorem i opisem. Do KSeF taka pozycja nie idzie jako rachunek bankowy, bo schemat FA(3) go nie przewiduje: przy formie płatności "Inne" opis płatności uzupełnia się z niej automatycznie, a przy mieszance rachunku i innej metody XML niesie rachunek, a dane drugiej metody widać tylko na PDF. Szablony nie przyjmują takich pozycji, bo nie przechowują opisu płatności. CLI i MCP przyjmują je w tym samym polu co rachunek. Przy okazji eksport konfiguracji zapisuje dla rachunków ustawienie "Opis rachunku", którego dotąd nie odczytywał z bazy (#1160).
Kod pocztowy kontrahenta jest wymagany tylko dla adresu w Polsce. Kontrahent z Hongkongu, Irlandii czy Zjednoczonych Emiratów nie ma kodu pocztowego, a formularz i tak go żądał, więc trzeba było wpisywać zmyślone "00000", które trafiało na fakturę i do KSeF. Dla adresu poza Polską pole jest teraz opcjonalne w formularzu kontrahenta i w formularzach faktury i szablonu; XML wysyłany do KSeF przechodzi walidację schematu bez kodu, a na PDF linia z miastem drukuje się bez pustego miejsca po brakującym kodzie. Adres w Polsce bez kodu jest nadal odrzucany, po stronie kontrahenta i sprzedawcy. Ustawienia firmy wymagają kodu niezależnie od kraju; to zostanie osobną zmianą (#1161).
Pełny słownik form płatności FA(3): obok przelewu, gotówki i karty można wybrać płatność mobilną (BLIK, Google Pay, Apple Pay), bon, czek i kredyt — w formularzu faktury, szablonie, CLI i MCP. Faktury otrzymane z tymi formami zachowują ją przy synchronizacji zamiast spłaszczać do "Inne"; historyczne faktury z zachowanym XML są jednorazowo poprawiane przy pierwszym uruchomieniu. Szablony i faktury cykliczne nie oferują "Inne" (nie przechowują opisu płatności, więc faktura z nich wygenerowana nie przeszłaby do KSeF); szkic z "Inne" zapisany przed tą wersją poprosi o uzupełnienie opisu przy edycji lub wysyłce, a "Inne" w istniejących szablonach i harmonogramach jest jednorazowo zamieniane na domyślny przelew (tak i tak trafiało do KSeF jako przelew). Powiadomienie o fakturach cyklicznych generowanych w tle pokazuje od teraz także błędy generowania, zamiast zawsze zgłaszać sukces (#1132, #1112).Dodane
Stawki VAT dla sprzedaży zagranicznej — na fakturze, w szablonie i w kartotece produktów można teraz wybrać `0% WDT` (wewnątrzwspólnotowa dostawa towarów), `0% eksport`, `o.o.` (odwrotne obciążenie), `n.p.` oraz `n.p. UE` (usługi z art. 100 ust. 1 pkt 4). Dotychczasowe jedyne `0%` oznaczało dla KSeF zawsze krajowe zero — kto wystawiał WDT albo eksport, deklarował mimowolnie złą kategorię; teraz wybór jest jawny: `0% (kraj)`, `0% WDT` albo `0% eksport`. Stawki z dokumentów sprzed tej wersji działają bez zmian i znaczą dokładnie to samo co wcześniej. Przy synchronizacji faktur otrzymanych wariant stawki (WDT, eksport, usługi UE) jest od teraz zachowywany, a nie sprowadzany do `0%`/`n.p.` (#1140).
Walidacja sumy kontrolnej numeru rachunku bankowego i IBAN (mod-97, ISO 7064/13616) — przy dodawaniu i edycji rachunku aplikacja wykrywa od razu pomyłkę w jednej cyfrze i osobnym komunikatem odróżnia błąd formatu od błędu sumy kontrolnej. Wcześniej sprawdzała tylko strukturę numeru (26 cyfr NRB, kod kraju i długość dla IBAN), więc przekręcony numer przechodził walidację i trafiał na fakturę oraz do kodu QR na PDF. Import konfiguracji sprawdza tylko kształt numeru, nie sumę kontrolną, żeby nie gubić po cichu rachunków zapisanych przed tą wersją — pełna walidacja włącza się przy najbliższej edycji (#1111).
Kolumna "VAT w PLN" w podsumowaniu VAT na PDF faktur walutowych — dla faktur w EUR, USD i innych walutach obcych kontrahent widzi teraz obok kwoty VAT w walucie obcej także jej przeliczenie na złote, dla każdej stawki i w wierszu "Razem", bez ręcznego przeliczania po kursie. Kolumna pojawia się tylko gdy waluta faktury jest inna niż PLN i znany jest kurs; faktury w PLN wyglądają bez zmian. Przeliczenie korzysta z kursu do celów VAT (art. 106e ust. 11), jeśli jest ustawiony w formularzu, w przeciwnym razie z kursu umownego faktury (#916).
Pełny słownik kodów krajów FA(3) w polu kraju kontrahenta i siedziby — wyszukiwanie po nazwie kraju albo kodzie ISO zamiast krótkiej, zamkniętej listy, więc kontrahenci z Kanady, Hongkongu, Wielkiej Brytanii, Chin i pozostałych krajów spoza dotychczasowego zestawu dają się teraz wybrać wprost, bez obchodzenia formularza. Aplikacja waliduje zapisany kod względem tego samego słownika (#1115).
Poprawione
Faktura bez wybranego kontrahenta i bez wpisanego NIP zapisuje się poprawnie. Zapis kończył się dotąd błędem bazy (`NOT NULL constraint failed: invoices.contractor_is_jst`) mimo że formularz oznacza kontrahenta jako opcjonalnego — bindowanie danych kontrahenta wysyłało jawny `NULL` do kolumn `contractor_is_jst`/`contractor_is_gv` zamiast wartości domyślnej; dotyczyło to tworzenia faktury, edycji z usunięciem kontrahenta i importu backupu. Przy okazji: dane kontrahenta wpisane ręcznie bez nazwy (np. sam NIP albo adres) formularz odrzuca teraz czytelnym komunikatem, zamiast przepuszczać je do tego samego błędu bazy albo gubić po cichu (#1151).
Faktury ze stawką 0% przechodzą wysyłkę do KSeF. Podsumowanie VAT w generowanym XML trafiało do pól, których schemat FA(3) nie zna (`P_13_6`/`P_14_6`), więc KSeF odrzucał każdą fakturę z zerową stawką; historyczne 7% i 22% lądowały z kolei w polach o innym znaczeniu prawnym (ryczałt taksówek i procedura szczególna). Mapowanie stawek na pola podsumowania zostało przepisane według adnotacji urzędowego schematu i objęte testami walidacji XSD; przy fakturach walutowych kolumna "VAT w PLN" na PDF sumuje się teraz dokładnie do kwot wysłanych do KSeF (#971).
Narzędzie wiersza poleceń działa na Linuksie z pakietu .deb. Plik `ksefka-cli` trafiał do paczki bez prawa uruchamiania, więc każde uruchomienie kończyło się komunikatem o braku dostępu, a przycisk instalacji CLI w Ustawieniach tworzył dowiązanie do pliku, którego nie da się wykonać. Skrypt wydania kopiował gotowe binarium na pusty plik zastępczy, a `cp` zostawia prawa pliku docelowego. Dotyczyło każdego wydania .deb od czasu dołączenia CLI do pakietu, czyli od 0.2.0 (#1134).
Aplikacja nie ginie już przy starcie na Linuksie z sesją Wayland. Zapamiętany rozmiar okna rósł przy każdym uruchomieniu na zestawie monitorów o różnym skalowaniu i przy dostatecznie dużej wartości (u zgłaszającego 28252×20708) przekraczał zakres, którym GTK liczy bufor rysowania — proces kończył się naruszeniem ochrony pamięci, zanim pokazał okno. Zapamiętany rozmiar jest teraz sprawdzany przed startem i odrzucany, gdy wykracza poza rozsądek; okno dostaje wtedy wymiary domyślne. Ta sama wada rozdymała okno na macOS i Windowsie, tylko tam kończyła się oknem większym od ekranu zamiast awarią. Kto już ma taki stan na dysku, dostanie go wyczyszczonego przy pierwszym uruchomieniu nowej wersji (#1106).
Okno nie otwiera się już większe, niż było przy zamykaniu. Rozmiar zapisywał się w pikselach fizycznych i wracał jako fizyczne, więc po przeniesieniu okna na monitor o innym skalowaniu te same liczby znaczyły co innego i okno rosło z każdą taką przeprowadzką. Przy starcie jest teraz przycinane do ekranu, na którym faktycznie ląduje. To ta sama wada, która na Linuksie z Waylandem kończyła się awarią (#1106).
Log startowy na Linuksie zapisuje, czy sesja graficzna to Wayland czy X11. Zgłoszenie awarii na Waylandzie zaczynało się dotąd od pytania, czy sesja to Wayland czy X11. Teraz odpowiedź jest w dzienniku, zapisana zanim pojawi się okno, więc przetrwa nawet awarię przy starcie (#1106).
Baner nowej wersji w pasku bocznym nie powtarza już tego samego zdania dwa razy. Pod nagłówkiem "Nowa wersja 0.13.2" stało napisane "Nowa wersja KSeFka v0.13.2" i tyle. Teraz jest tam pierwsza zmiana z danego wydania, a wydanie bez opisu nie dostaje tej linijki wcale (#1128).Dodane
Powiadomienie o nowej wersji na Windows i Linuksie — aplikacja sprawdza teraz listę wydań i pokazuje w pasku bocznym baner z numerem nowej wersji oraz przyciskiem otwierającym stronę pobierania. Wcześniej sprawdzanie aktualizacji na tych systemach kończyło się po cichu błędem, bo manifest automatycznej aktualizacji obejmuje wyłącznie macOS — o nowym wydaniu można było dowiedzieć się jedynie wchodząc na stronę. Na macOS bez zmian: aktualizacja nadal instaluje się w miejscu, jednym kliknięciem. Baner pojawi się przy wydaniu następującym po tym, bo dopiero ta wersja zawiera sam mechanizm sprawdzania (#1123).Dodane
Kod QR do zapłaty faktury otrzymanej (PRO) — w szczegółach nieopłaconej faktury otrzymanej w PLN wyświetla się kod QR w standardzie ZBP ("zeskanuj i zapłać"): jeden skan w aplikacji banku wypełnia numer rachunku sprzedawcy, kwotę, tytuł i NIP odbiorcy, bez ręcznego przepisywania. Dla kwot powyżej 9 999,99 zł (limit formatu ZBP) kod przenosi dane bez kwoty, a aplikacja pokazuje ją obok do wpisania ręcznie (#1102).
Kod QR do zapłaty na PDF faktury wystawionej i pro-formy (PRO) — ten sam standard ZBP po stronie sprzedawcy: kontrahent skanuje kod z wydruku lub PDF w aplikacji swojego banku zamiast przepisywać numer konta i kwotę. Kod pojawia się w sekcji płatności, obok danych do przelewu; kody weryfikacyjne KSeF zostają bez zmian w stopce dokumentu. Opcja jest domyślnie wyłączona i włączana osobno dla każdej firmy w Ustawieniach → Personalizacja. Warunki: dokument w PLN, płatność przelewem, dokument nieoznaczony jako zapłacony i rachunek w PLN z poprawnym numerem (#1103).
Poprawione
Faktura za usługę opłaconą z góry nie wypada już poza swój miesiąc. W trybie przypisania "Data sprzedaży" faktura z okresem rozliczeniowym, ale bez daty sprzedaży, trafiała do miesiąca, w którym okres się kończy — roczny abonament wystawiony w sierpniu 2026 lądował w sierpniu 2027 i znikał z bieżących zestawień. Teraz okres wyznacza miesiąc tylko wtedy, gdy zamknął się najpóźniej w dniu wystawienia; w przeciwnym razie liczy się data wystawienia. Faktury za miniony okres (np. wystawione 1 czerwca za maj) zostają w maju jak dotąd, a wpisana ręcznie data sprzedaży dalej ma pierwszeństwo. Jeśli takie faktury już masz, po aktualizacji zmienią miesiąc na liście, pulpicie i w podsumowaniach — warto sprawdzić zestawienia przekazane księgowej (#1109).
Foldery miesięczne w ZIP dla księgowej odpowiadają miesiącowi, w którym widzisz fakturę w aplikacji. Wcześniej powstawały po dacie wystawienia, niezależnie od ustawienia "Przypisanie do miesiąca" — filtrowałeś listę na maj, eksportowałeś i dostawałeś folder `2026-06/`. Teraz oba miejsca mówią to samo. Nazwy plików zostają bez zmian: data w nazwie to nadal data wystawienia, żeby księgowa mogła sparować plik z dokumentem, który ma przed sobą (#1116).Dodane
Faktury pro-forma — dokument handlowy poza KSeF (wezwanie do zapłaty, oferta w B2B, dokument celny). Własna zakładka "Pro-formy" i osobna seria numeracji `PF/<nr>/<rok>`, niezależna od numerów faktur. Po otrzymaniu wpłaty akcja "Otrzymano wpłatę" przekształca pro-formę jednym krokiem w fakturę VAT albo zaliczkową (pełna kwota, wszystkie pozycje); pro-forma zostaje w historii ze statusem "zrealizowana" i linkiem do wystawionej faktury. Pro-formy są w całości wyłączone z KSeF, JPK, podsumowań pulpitu i eksportu ZIP dla księgowej (#955, #915).
Obsługa pro-form w CLI i serwerze MCP — podkomendy `proforma list|get|create|convert|cancel` w CLI oraz narzędzia `list_proformas`, `get_proforma`, `create_proforma`, `convert_proforma`, `cancel_proforma` dla asystenta (Claude Desktop). Asystent może teraz wystawić pro-formę i przekształcić ją w fakturę po wpłacie, tak jak w aplikacji. Inwariant wykluczenia z KSeF pozostaje nienaruszony (#1093).
Zmienione
Kwoty w oknach wyboru faktur zaliczkowych i korygujących, w wyszukiwarce produktów, na liście produktów oraz w szczegółach faktury cyklicznej są formatowane po polsku — przecinek dziesiętny i symbol waluty (np. "1234,56 zł" zamiast "1234.56 PLN"), a od 10 000 również separator tysięcy (#1059, #1060).
Potwierdzenie usunięcia faktury cyklicznej korzysta ze spójnego okna aplikacji (obsługuje tryb ciemny, pokazuje stan trwania operacji, przy błędzie pozwala ponowić) zamiast natywnego okna systemowego (#1059, #1060).
Serwer MCP wskazuje asystentowi dokumentację użytkownika, więc pytania o działanie funkcji KSeFki są odpowiadane z dokumentacji zamiast zgadywane (#1052, #1053).Dodane
Faktury korygujące z pozycjami „przed korektą / po korekcie" (metoda StanPrzed wg Podręcznika KSeF 2.0 §2.13.4) (#1039).
Zbiorcze oznaczanie faktur jako niezapłacone i nieprzeczytane (#1041).
Uwierzytelnianie i synchronizacja w kontekście jednostki podrzędnej (IDWew, format NIP-XXXXX) — dla pracowników działów, których token lub certyfikat KSeF jest wystawiony na identyfikator wewnętrzny zamiast głównego NIP firmy; ustawiane per firma w Ustawieniach. Synchronizacja pobiera wyłącznie faktury danej jednostki (eksport Subject3), a nie całego NIP (#1018).
Zmienione
Pasek akcji zbiorczych ukrywa nieaktywne przyciski, a zaznaczenie pozostaje po wykonaniu akcji (poza usuwaniem) (#1041).
Poprawione
Filtr jednostki wewnętrznej (IDWew) obejmuje teraz również sprzedaż — faktury wystawione oznaczone IDWew innej jednostki (Podmiot3 w roli wystawcy) są ukrywane; faktury bez oznaczenia jednostki pozostają widoczne (#1032).Dodane
Filtr faktur zakupu po jednostce wewnętrznej nabywcy (Podmiot3 „Odbiorca" / IDWew) — dla firm z kilkoma placówkami na jednym NIP. Ustawiany per firma w **Ustawienia → Firmy** (pole „Filtr jednostki (zakupy)"); po włączeniu lista faktur, liczniki na pulpicie, podsumowanie miesięczne i licznik nieprzeczytanych pokazują wyłącznie zakupy danej jednostki, z banerem i opcją „Pokaż wszystkie". Funkcja w tym wydaniu darmowa, w kolejnym przejdzie do PRO (#1020).
Globalne ustawienie daty przypisania faktury do miesiąca — wybór między datą wystawienia a datą sprzedaży (#986).
Ustawienia → Prywatność: reset anonimowego identyfikatora użycia (#1005).
Przypomnienie o braku terminu płatności przy pierwszym zapisie nowej faktury wystawionej — łagodne potwierdzenie z opcją "Nie pytaj ponownie" (#1004).
Zmienione
Sprawdzanie aktualizacji odpytuje teraz najpierw `ksefka.com` (anonimowy, zerowalny identyfikator instalacji, bez adresu IP) — zliczanie aktywnych instalacji (#1005).
Poprawione
Numeracja faktur — druga i kolejna faktura w nowym miesiącu nie kontynuuje już sekwencji z poprzedniego miesiąca (np. po `017/05` czerwiec dawał `018/06` zamiast `002/06`) (#1003).
Pole "Typ" w oknie zgłaszania feedbacku pokazuje etykietę zamiast surowej wartości (#1002).
Import faktury z XML — dla faktur walutowych VAT 0% bez kursu umownego kurs jest prefillowany z `FaWiersz/KursWaluty`, więc zapis nie jest już blokowany (#996).
Faktury z okresem dostawy (`OkresFa`) zamiast pojedynczej daty sprzedaży trafiają teraz do właściwego miesiąca — w trybie „Data sprzedaży" przypisanie korzysta z końca okresu (`P_6_Do`) zamiast wpadać na datę wystawienia (#1000).
Stan zwinięcia miesięcy na liście faktur jest zapamiętywany per firma (#1015).
Pulpit — podsumowanie miesięczne uwzględnia teraz lokalne faktury otrzymane w sumie kwotowej (#993).Poprawione
Duplikacja faktur między profilami firm o tym samym NIP (regresja z 0.9.0) — nowy, opcjonalny tryb "Rozdzielaj firmy po nazwie" (zakładka Firmy) kieruje każdą fakturę do jednego profilu według nazwy podmiotu, z kolejką ręcznych przypisań dla nazw niezmapowanych oraz uruchamianym na żądanie porządkowaniem istniejących duplikatów. Funkcja w tym wydaniu darmowa, w kolejnym przejdzie do PRO (#981, #987).
Import backupu — przywracanie faktur nie kończy się już błędem bazy ("65 values for 66 columns"); faktury z archiwum są znów poprawnie zapisywane (#988, #990).Dodane
Eksport pliku przelewu w formacie SEPA (pain.001.001.03) dla faktur w walucie EUR (#977, #979).
Eksport pliku przelewu w formacie podzielonej płatności (MPP / split payment) Elixir (#975, #976).
Poprawione
Niezawodność migracji bazy danych przy aktualizacji — przebudowa tabel odbywa się teraz z wyłączonym egzekwowaniem kluczy obcych i końcową weryfikacją integralności, więc nie dochodzi do kaskadowego usunięcia powiązanych danych (pozycje faktur, załączniki itp.) na zapełnionej bazie. Jednorazowa naprawa unikalności numeru KSeF z 0.9.0 została przeniesiona do zwykłej migracji (#973, #982).Dodane
Eksport pliku przelewu bankowego w formacie Elixir-0 dla faktur otrzymanych — gotowy plik do wczytania w bankowości elektronicznej (#965, #967).
Poprawione
Synchronizacja KSeF — faktury w walucie obcej z zerowym kursem (`KursWaluty = 0` jako placeholder) nie blokują już synchronizacji (#968, #972).
Unikalność numeru KSeF (`invoices.ksef_number`) jest teraz ograniczona do pary `(company_id, ksef_number)` — ten sam numer może wystąpić w różnych firmach (#969, #974).
Linki do faktur powiązanych otwierają widok szczegółów zamiast edycji (#963, #964).Dodane
Trwałe przechowywanie tokenów licencji PRO w Postgres (Neon) na backendzie strony (#944, #945).
Poprawione
Synchronizacja KSeF — faktury z zerowym kursem waluty (`FaWiersz/KursWaluty = 0`, częsty placeholder na fakturach w PLN) nie blokują już całej synchronizacji; kurs 0 jest traktowany jako brak kursu, a kurs ujemny pozostaje błędem (#949, #946).
Synchronizacja KSeF — faktury bez podsumowania VAT (`P_13_X`) przy dodatnim `P_15` są teraz pobierane: podsumowanie VAT jest rekonstruowane z pozycji faktury, a gdy brak danych do rekonstrukcji — faktura zapisywana jest z samym brutto, zamiast blokować synchronizację (#950, #946).Dodane
Wiele rachunków bankowych (do 2) na fakturze, w szablonie i przy korekcie — z prefillem przy tworzeniu z szablonu i kopiowaniu/korekcie (#921, #923).
Osobna numeracja (opt-in) dla faktur korygujących — własna pula `FKOR/{YYYY}/{MM}/{NNN}` zamiast wspólnego ciągu z fakturami regularnymi (#892).
Tryb "w stu" (od ceny brutto) per pozycja faktury i szablonu — toggle Net/Br przy cenie jednostkowej, back-derywacja netto z targetowego brutto (#898).
Poprawione
PDF — flagi JST/GV nabywcy pod blokiem nabywcy gdy ustawione na TAK; label "Waluta" → "Kod waluty"; fix sync dla faktur otrzymanych (flagi zawsze `false` w snapshocie) (#891).
Korekta — przycisk "Wystaw korektę" i picker pokazują tylko faktury kwalifikujące się jako oryginał (`direction='issued'`, status KSeF `pending`/`accepted`/`synced`); backend waliduje też przy tworzeniu (#909).
Korekta — prefill zachowuje dosłowne brutto oryginału (przełącza linię w tryb "w stu" gdy wykryje rozbieżność ≥0,005), nawet jeśli oryginał miał inne zaokrąglenie niż KSeFka by sama wyliczyła (#899).
Re-edycja draftu z pozycją w trybie "w stu" — pole "Cena brutto" wypełnia się po ponownym otwarciu (seed `wStuTargets` reaguje teraz na zmiany identyczności wierszy) (#899).
Pulpit — sumy kwotowe pomijają oryginał faktury gdy istnieje aktywna korekta typu 1 lub 3 (`ksef_status ∈ {accepted, synced}`); działa też wstecz między miesiącami i tranzytywnie A → B → C (#902).
Numer faktury — licznik "Następny NNN" inkrementuje się przy zatwierdzeniu wysyłki / potwierdzeniu KSeF / synchronizacji; przy nieudanej wysyłce nie rusza, drafty współdzielą sugerowany numer (#894).
Zmienione
Multi-account cleanup: zrzucono legacy kolumny `invoices.bank_*` i `invoice_templates.bank_account_id` (migracja 055); wszystkie ścieżki używają już tylko `invoice_bank_accounts` / `template_bank_accounts`, backup szablonów round-trip-uje pełną listę rachunków (#929).
Pulpit — sumy kwotowe liczą **tylko** faktury z `ksef_status ∈ {accepted, synced}`; drafty, ready_to_send, sending, pending, rejected i lokalne — pomijane. Liczniki dokumentów bez zmian (#906).
Sugestia numeru w formularzu — prefill skacze za fakturami wysłanymi do KSeF, ignoruje drafty; modal duplikatów dostał trzeci przycisk "Użyj następnego: <X>" (#894).
Dodane
Panel „Odzyskiwanie synchronizacji" w Ustawienia → KSeF: ręczne cofnięcie znacznika synchronizacji o 1, 7, 30 dni lub do dowolnej daty (Wybierz datę...) — pozwala ponownie pobrać faktury, które nie zapisały się przy poprzedniej synchronizacji (#850)
Webhook HTTP PRO dla nowych faktur otrzymanych z synchronizacji KSeF: Ustawienia → Integracje → URL endpointu (n8n, Make, Zapier, własny serwer) + przycisk „Wyślij testowy event"; payload JSON zawiera `invoice_id`, `ksef_reference_number`, `sync_timestamp`, pełny XML FA(3); nagłówek `X-KSeFka-Event-Type: invoice:received-from-sync` (#884, #886)
Event log JSONL PRO dla nowych faktur otrzymanych z synchronizacji KSeF: Ustawienia → Integracje → ścieżka pliku + toggle włączenia; każde zdarzenie dopisywane jako jedna linia JSON (NDJSON) — konsumowalne przez `tail -f`, n8n Watch File, fswatch, własne skrypty; przycisk „Wyczyść plik" do truncate (#884, #887)
Poprawione
Synchronizacja KSeF: nieudany zapis pojedynczej faktury do bazy nie powoduje już pominięcia jej w kolejnych synchronizacjach inkrementalnych — `last_sync_at` przesuwa się dopiero gdy cały cykl zakończy się czysto (#850)
MCP `create_invoice` akceptuje i zapisuje pola `payment_date` oraz `payment_description` (wcześniej były cicho wyrzucane przez deserializację); doc narzędzia rozdziela semantykę `is_paid` (XML Zaplacono=1) od `internal_is_paid` (ustawiane przez `mark_invoice_paid`) (#845)
Uwierzytelnianie KSeF wybiera certyfikat typu Authentication zamiast preferować najnowszy aktywny — po wgraniu certyfikatu Offline aplikacja nie próbuje już używać go do logowania (KSeF zwracał błąd 21115); firma z samym certyfikatem Offline nie kwalifikuje się też do background sync (#862)
Dodane
Masowy eksport do ZIP (PDF + XML + załączniki) dla faktur zagranicznych spoza KSeF (#832)
Filtr "Poza KSeF" na liście faktur + flaga CLI `--only-outside-ksef` (#831, #834)
Załączniki w modelu PRO: pierwszy do faktury otrzymanej FREE, reszta PRO (#337, #830)
Filtry "Niezapłacone" i "Poza KSeF" jako przyciski toggle zamiast checkboxów (#837, #839)
Kafelki Pulpitu (Wystawione, Otrzymane, Szkice, Do wysłania) ograniczone do bieżącego miesiąca (#835, #838)
Poprawione
Automatyczny kurs NBP dla ręcznie wprowadzonych faktur walutowych — zliczane teraz w PLN na Pulpicie (#814, #815)
Filtr "Niezapłacone" uwzględnia `is_paid` z KSeF (#819)Dodane
Narzędzia MCP dla załączników faktur (#825)
Poprawione
Zachowanie numeru faktury przy edycji faktury otrzymanej (#824)
Filtr Niezapłacone pomija faktury z `is_paid=true` z KSeF (#822)
Usunięto `(KSeF)` z etykiety Zapłacone w widoku faktury (#821)Dodane
Personalizacja faktury dla użytkowników PRO (#752)
Personalizacja UI KSeFki dla użytkowników PRO (#809)
Zapamiętywanie ostatnio użytego powodu zwolnienia z VAT per firma (#790)
Poprawione
Telefon firmy z ustawień jest teraz renderowany na fakturze PDF pod adresem email — wcześniej pole było zbierane, ale nigdy nie trafiało na dokument (#752)
Synchronizacja w tle obejmuje wszystkie firmy z poświadczeniami KSeF, nie tylko aktualnie wybraną (#585)
Cały kafelek powiadomienia o aktualizacji jest klikalny (#783)
Logi diagnostyczne do rozwiązywania problemów z synchronizacją (#808)Dodane
Narzędzia MCP `get_environment` i `switch_environment` — sesyjne odczytanie i przełączenie aktywnego środowiska KSeF (test/demo/production) bez restartu klienta MCP (#800, #801)
Narzędzia MCP `list_companies` i `switch_company` — listowanie firm w aktywnym środowisku i sesyjne przełączanie aktywnej firmy bez restartu klienta MCP (#802, #803)
Akceptacja aliasu `EU_VAT` dla `tax_id_type` w narzędziu MCP `create_invoice` (kanoniczna wartość pozostaje `VAT_EU`) (#800)
Dwujęzyczne opisy narzędzi MCP (angielski + polski) — zapytania w języku polskim poprawnie wyszukują narzędzia przez `tool_search` (#804, #805)
Poprawione
Lista faktur i statystyki odświeżane po utworzeniu faktury przez MCP bez konieczności ręcznego odświeżenia (#805)Dodane
Wysyłanie faktur e-mailem (SMTP) z konfiguracją per firma (#780, #792)
Typ identyfikatora IDWew (identyfikator wewnętrzny) dla Podmiot3 z walidacją formatu (#791, #794)
Combobox z podpowiedziami dla podstawy zwolnienia z VAT (#785, #787)
Narzędzia MCP do faktur cyklicznych (#630, #778)
Generowanie PDF w języku niemieckim (#769, #775)
Komenda CLI `ksefka export` do eksportu faktur jako PDF i/lub XML (PRO) (#633)
Narzędzie MCP `export_invoice` z parametrami id, format, language, output_dir (#633)
Poprawione
Zapamiętywanie pozycji i rozmiaru okna przy resize/move z debounce (#776, #781)
Checkbox "Zaplacona" ukryty gdy faktura oznaczona jako opłacona w KSeF (#767)Dodane
Pobieranie XML faktury jako plik, pojedynczo i masowo (#760)
Jeden przycisk pobierania dla wszystkich formatów (PDF PL/EN/KSeF, XML); zapamiętuje ostatni wybór (#761)
Wzorzec nazwy pobieranego pliku w ustawieniach firmy z podglądem na żywo: {NUMER}, {KONTRAHENT}, {YYYY}, {MM}, {DD}, {KSEF}, {KIERUNEK} (#762)Poprawione
Synchronizacja faktur korygujących (KOR) z KSeF: obsługa elementu `StanPrzed` — pary wierszy przed/po korekcie z tym samym `NrWierszaFa` nie powodują już błędu UNIQUE constraint (#751)
Deterministyczne sortowanie wierszy korekty: wiersze „przed" zawsze wyświetlane przed wierszami „po" (`ORDER BY line_number, is_before_correction DESC`)
Logowanie ostrzeżeń przy nieoczekiwanych wartościach `StanPrzed` zamiast cichego domyślnego `false`
Walidacja XSD: nowy test dla faktury korygującej z `StanPrzed` (TypKorekty=2)Poprawione
PDF z KSeF: pole „Uwagi" (notes) pojawia się w PDF — emitowane jako `DodatkowyOpis` w XML FA(3) (#753)
PDF z KSeF: kod QR weryfikacyjny pojawia się w PDF — przekazanie `qr_code_url` do generatora (#753)
PDF z KSeF: naprawiony layout sekcji QR — tekst i link nie są ucięte (#753)
Backward sync: `DodatkowyOpis` z kluczem „Uwagi" parsowany z powrotem do pola `notes` fakturyDodane
Walidacja XSD wygenerowanego XML faktur w testach — 16 fixture'ów pokrywających różne scenariusze (standardowa, korekta, zaliczka, marża, waluta obca, itp.) (#740, #745)
Poprawione
XML: stawki „oo" i marży nie emitują P_14_10/P_14_11 (nie istnieją w XSD FA(3))
XML: `DaneFaKorygowanej` emituje wymagane elementy `NrKSeF`/`NrKSeFN` (choice w XSD)
XML: `PMarzy` emituje wymagany znacznik `P_PMarzy=1` przed konkretnym typem marżyDodane
Sekcja adnotacji na fakturze PDF — odwrotne obciążenie, metoda kasowa, samofakturowanie, mechanizm podzielonej płatności (#737)
Poprawione
Walidacja XSD: `Zaplacono` emitowane tylko dla zapłaconych faktur (typ `TWybor1` akceptuje tylko wartość "1") (#742)Dodane
Ostrzeżenie o przeszłej dacie wystawienia przy wysyłaniu faktury do KSeF — dialog z opcją zmiany daty na dzisiejszą (#727)
Tworzenie faktury z pliku XML — przycisk "Utwórz z XML" i parsowanie FA(3) (#724)
Akcja grupowa "Ustaw jako zapłacone" na liście faktur
Zmienione
Oznaczenie niezapłaconych/nieprzeczytanych faktur na liście zmienione na border-left
Skrócone nazwy przycisków akcji grupowych
Poprawione
Lepszy komunikat błędu certyfikatu/uwierzytelniania gdy brak aktywnej firmy (#730)
Walidacja formatu daty w `update_invoice_issue_date`
Surfacowanie ostrzeżeń o brakach w XML do użytkownika
Logowanie błędów `try_get(nip)`, surfacowanie błędów DB w warnings
Ostrzeżenie przy częściowej aktualizacji batch
Windows: uruchamianie GUI bezpośrednio zamiast przez niezarejestrowaną komendęPoprawione
Formatowanie kodu (SettingsPage.tsx, xml_parser.rs)Dodane
Eksport i import danych firmy jako `.tgz` — do backupu albo przeniesienia na inny komputer (#467)
Status zapłaty na fakturach: pole w formularzu, checkbox w szczegółach, czerwone tło niezapłaconych na liście, filtr „Tylko niezapłacone"
Faktury `ready_to_send` wysyłają się same po każdym syncu z KSeF
Sync KSeF odpala się od razu po przełączeniu środowiska, nie trzeba czekać na timer (#373)
Faktury cykliczne wymagają licencji PRO (#610)
CLI: `mark-paid` / `mark-unpaid`, filtr `--invoice-type` w `list-invoices` (#638), obsługa duplikatów (#632)
MCP: `mark_invoice_paid`
Import z KSeF odczytuje kurs VAT (`KursWaluty`) z wierszy faktur walutowych (#462)
Poprawione
**Windows (BREAKING):** Binary zmienione z `KSeFka.exe` na `ksefka-app.exe` — naprawia pętlę uruchamiania przy instalacji CLI (#687). **Trzeba przeinstalować.**
**Windows:** Instalator dodaje katalog do `PATH` — CLI działa z każdego terminala (#687)
**Windows:** Otwieranie PDF przez plugin Tauri zamiast ręcznego kodu per-platforma
Sync wsteczny nadpisywał datę HWM ustawioną przez sync do przodu (#698)
Brakujące kolumny JST/GV w bazie — migracja naprawcza (#685)
XML: `<Zaplacono>` i `<DataZaplaty>` nie były emitowane; `DataZaplaty` jest wymagane gdy `Zaplacono=1`
PDF pokazuje rzeczywistą wersję aplikacji zamiast starej
CLI: `--from-nip` nie uzupełniał REGON i kodu kraju z GUS (#628)
Kopiowanie faktury i tworzenie korekt gubiło status zapłatyDodane
Komendy CLI do zarządzania katalogiem produktów: `list-products`, `get-product`, `create-product`, `update-product`, `delete-product` z podwójnym wejściem (flagi lub `--from-json`) (#624)
Narzędzia MCP: `list_products`, `get_product`, `create_product`
Komendy CLI `finalize-invoice` i `unfinalize-invoice` do zatwierdzania/cofania faktur do wysyłki KSeF (#625)
Flaga `--finalize` na `create-invoice` — tworzenie i zatwierdzenie jednym krokiem
Narzędzia MCP: `finalize_invoice`, `unfinalize_invoice`
Walidacja produktów: stawka VAT, niepusta nazwa, zakres rabatu 0–100%, zaokrąglanie cen
Ochrona przed wielokrotnym uruchomieniem aplikacji (`single-instance`) (#639)
Obsługa typu faktury `KOR_ROZ` (korekta rozliczeniowej) — sync z KSeF, XML, PDF, formularz (#649)
Podmiot3 (dodatkowe podmioty) na fakturach — zwijana sekcja w formularzu, generowanie XML, parsowanie z KSeF, kopiowanie/szablony (#651)
Flagi JST/GV na kontrahentach — dynamiczne generowanie w Podmiot2 XML zamiast hardcoded „2" (#652)
Komendy CLI `get-contractor`, `create-contractor`, `update-contractor` z flagami `--is-jst`/`--is-gv`
Narzędzia MCP: `create_contractor`, `update_contractor`
Poprawione
Korekta faktury zaliczkowej generuje `KOR_ZAL` zamiast `KOR` w XML (#648)
Kurs waluty na fakturze korygującej przepisywany z faktury pierwotnej zgodnie z art. 31b ustawy o VAT (#658)
Finalizacja faktur z kontrahentem inline (bez zapisu do bazy kontrahentów) działa poprawnieDodane
Obsługa faktur korygujących — wystawianie, walidacja numeru KSeF, automatyczne ładowanie pozycji, szczegóły korekty na PDF (#529)
Komenda CLI `ksef-authorize` do zapisu tokenu autoryzacyjnego KSeF (#642)
Narzędzie MCP `ksef_authorize` do zapisu tokenu KSeF z poziomu AI
Poprawione
Przycisk „Synchronizuj KSeF" pojawia się gdy skonfigurowany jest token LUB certyfikat (wcześniej tylko certyfikat)Dodane
Uwierzytelnianie certyfikatem
Wgrywanie certyfikatu KSeF z pliku (.p12/.pfx) zamiast automatycznego generowania (#440)
Uwierzytelnianie XAdES z podpisem certyfikatu — jedyna metoda logowania do KSeF
Szyfrowanie tokenów zapisanych na dysku algorytmem AES-256-CBC (#440)
Wysyłka faktur
Status „Gotowa do wysyłki" (ready_to_send) z akcjami finalizacji i cofnięcia finalizacji (#524)
Kod QR OFFLINE na PDF-ach faktur gotowych do wysyłki (#525)
Wykrywanie awarii KSeF z automatycznym wysyłaniem kolejki po przywróceniu usługi
Faktury
Obsługa faktur zaliczkowych — powiązanie z fakturą rozliczeniową z automatycznym odliczeniem i przeliczeniem walut (#465, #601)
Tworzenie faktur cyklicznych na podstawie istniejącej faktury, dzięki PiotrK (#546)
Kopiowanie faktury jako nowej — „Więcej → Utwórz nową na podstawie" w widoku szczegółów, dzięki PawełB (#578)
Parsowanie XML
Parsowanie i zapis wszystkich pól FA(3) z pobranych faktur (płatność, adnotacje, metadane)
Parsowanie kwot brutto (P_9B/P_11A) w pozycjach faktur (#538)
Rozpoznawanie statusu „Zapłacono" z XML-a zsynchronizowanych faktur (#399)
Jednorazowy backfill pól dla wcześniej zsynchronizowanych faktur
CLI i MCP
Narzędzie CLI do odczytu bazy danych z wiersza poleceń (#310)
Serwer MCP do integracji z AI (ChatGPT, Claude Desktop, itp.) (#312)
Automatyczna aktualizacja CLI po aktualizacji aplikacji (#426)
CLI bundlowany jako sidecar Tauri z UI instalacji/deinstalacji (#414)
3-dniowy trial PRO dla CLI (#418)
Sprawdzanie licencji PRO w komendach CLI
Licencja PRO
Infrastruktura licencji PRO (#387)
Interfejs użytkownika
Załączniki plików dla faktur otrzymanych (#447)
Skróty klawiszowe do nawigacji i akcji (#371)
Przycisk szybkiej synchronizacji na liście faktur (#397)
Kafelki dashboardu klikalne — przejście do filtrowanej listy faktur
Filtr statusu w pasku wyszukiwania faktur
Kolumny tabeli faktur z możliwością zmiany szerokości (#464)
Ukrywanie pola konta bankowego dla metod płatności bez przelewu (#363)
Obcinanie długich nazw pozycji z tooltipem po najechaniu
Ukrywanie kolumny Rabat gdy nieużywana
Kafelkowy układ szczegółów faktury — pozycje na pełną szerokość
Ostrzeżenie o zapłacie z numerem faktury w szczegółach
Status „Lokalny" dla faktur otrzymanych (#490)
Zwijane adnotacje i puste stany na dashboardzie (#474)
Subtelne animacje wejścia i mikrointerakcje przy hover
Inne
Zmiana identyfikatora aplikacji z `pl.zalun.ksefka` na `pl.nod.ksefka` z automatyczną migracją danych
Domyślne środowisko KSeF ustawione na produkcję (#384)
Trwałe przechowywanie UPO w osobnej tabeli (#374)
Poprawione
Przełączanie środowisk test/produkcja trwa natychmiastowo zamiast do minuty (#598)
Dashboard odświeża statystyki po usunięciu, edycji i tworzeniu faktur (#515)
Podwójne ostrzeżenie o środowisku testowym przy przełączaniu (#596)
Cache XML czyszczony przy zapisie faktury — edycje odzwierciedlane w KSeF (#600)
Formularz faktury z szablonu nie resetuje pól kontrahenta edytowanych ręcznie (#575)
Automatyczny numer faktury czyszczony przy zmianie kierunku na „Otrzymana" (#493)
Widok faktury rozciąga się na pełną szerokość okna
Przycisk „Przeładuj z XML" zamiast mylącego „Pobierz ponownie z KSeF"
Zmienione
Ustawienia przeniesione do paska narzędzi jako przycisk z ikoną
Kolejność zakładek faktur: Wszystkie → Wystawione → OtrzymaneDodane
Kalendarz z popoverem przy polach dat na formularzu faktury — wybór daty kliknięciem oprócz wpisywania ręcznego (#360)
Wyświetlanie dat w polskim formacie DD.MM.RRRR z automatycznym formatowaniem i walidacją (#359)Dodane
Budowanie instalatorów dla Windows (MSI, EXE) i Linux (deb, AppImage) w workflow wydawania (#340)
Poprawione
Otwieranie plików działa na wszystkich platformach (macOS/Windows/Linux)Zmienione
Wsparcie dla Intel Mac (x86_64) w procesie wydawania — osobne natywne binaria dla Apple Silicon i Intel (#338)
Strona pobierania pokazuje dwa przyciski macOS (Apple Silicon / Intel) z automatycznym wykrywaniem architektury
Wzmocnione zabezpieczenia workflow: walidacja artefaktów, `latest.json` publikowany jako ostatni krok
Skill do automatyzacji wydawania nowych wersjiZmienione
Migracja biblioteki ikon z lucide-react na iconoir-react (mniejszy bundle, licencja MIT) (#335)
Gwiazdka przy aktywnej firmie w sidebarze i ustawieniach (spójność z kontami bankowymi)
Sprawdzanie aktualizacji co godzinę zamiast tylko przy starcieDodane
Ostrzeżenie o publicznie dostępnych danych w środowiskach testowym i demo — dialog przy starcie aplikacji i przy przełączaniu środowiska, ikona ostrzeżenia w pasku bocznym (#328)
Poprawione
Ponowne podpisywanie archiwum aktualizacji po zbudowaniu przez tauri-actionPierwsza publiczna wersja KSeFka.
Dodane
Integracja z KSeF (Krajowy System e-Faktur) — synchronizacja, wysyłka, pobieranie faktur
Zarządzanie firmami z obsługą wielu firm i środowisk (test/demo/produkcja)
Tworzenie i edycja faktur z pełnym wsparciem schematu FA(3)
Generowanie PDF z kodem QR i metadanymi KSeF
Generowanie XML zgodnego ze schematem FA(3) do wysyłki do KSeF
Zarządzanie kontrahentami z wyszukiwaniem NIP przez GUS BIR1
Zarządzanie kontami bankowymi z obsługą IBAN/SWIFT
Synchronizacja przyrostowa i wsteczna z KSeF
Automatyczna synchronizacja w tle z konfigurowalnymi ustawieniami
Obsługa walut obcych z automatycznym kursem NBP
Szablony faktur (zapisywanie i stosowanie)
Wyszukiwanie faktur z filtrami syntaktycznymi
Akcje grupowe na fakturach (PDF, oznacz jako przeczytane)
Dashboard ze statystykami i podsumowaniem miesięcznym
Panel powiadomień z historią
Ciemny motyw z obsługą motywu systemowego
Skalowanie rozmiaru czcionki (Cmd+/Cmd-/Cmd+0)
Automatyczne aktualizacje przez GitHub Releases
Formularz opinii i zgłaszania błędów
Podpisywanie kodu i notaryzacja macOS