Krajowy system e-Faktur

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
1

KSeF niedokończony prawnie - tak informacyjnie, żeby mieć wiadomość, że nie wszystkie dane, które podajemy są zapisane:

Jeśli jeszcze coś kojarzycie, to dajcie znać.

AdrianWladyka
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

mam problem z certyfikatem na NIP.. a konkretnie zamiast NIP generuje mi na PESEL

Zalogowałem sie na https://mcu.mf.gov.pl/web/login i robię sobie certyfikat KSEF. Dokładnie jak na ich cholernych filmiekach (filmik 1 i2)
Ale zamiast wygenerować mi na NIP wali na PESEL.

jakiś pomyśl co jest nie tak?

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

Grrr... na dzisiejszej środzie: "będzie w API scam, będzie, będzie, ale na razie w aplikacji nie ma, ale będzie".

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

Czy ta ich apka wizualizuje faktury z QRami zarówno onlinie jak i offline? Jeśli tak, to ktoś by zamieścił (nie chce mi się instalować wszystkiego, a z www nie da się offline uzyskać).

JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Nadałem uprawnienia na MCU.
Loguje sie ok.
Ale przy pobieraniu dannych dostaję:
RESPONSE POST https://ksef-demo.mf.gov.pl/api/v2/invoices/query/metadata?pageOffset=0&pageSize=100
Status: 403
Content:
Jakiś pomysł?

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

W kodzie QR2 ma być m.in. NIP sprzedawcy oraz typ kontekstu i kontekst... ale czego? certyfikatu? wysyłki faktury, jaką wykonam (a przecież fakturę mogę wysłać i jako jednostka i jako główny NIP)? Czegoś nie widzę, czy to jest faktycznie niejasne?

PK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Cześć, próbuję ogarnąć obsługę załączników, zaczynam od uprawnień: /api/v2/testdata/attachment
Dostaję 200, wygląda że jest ok.
Ale gdy dodaję fakturę z załącznikiem dostaję w historii sesji w szczegółach wysyłki: "Brak możliwości wysyłania faktury z załącznikiem" screenshot-20251112143734.png

Dodawał ktoś już załączniki do KSeF? Jak to ograliście ten temat?

K2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0
Dzyszla napisał(a):

W kodzie QR2 ma być m.in. NIP sprzedawcy oraz typ kontekstu i kontekst... ale czego? certyfikatu? wysyłki faktury, jaką wykonam (a przecież fakturę mogę wysłać i jako jednostka i jako główny NIP)? Czegoś nie widzę, czy to jest faktycznie niejasne?

(piszę osobno ze względu na objętość)

Ja rozumiem to tak (po nitce do kłębka):
Kod II (https://github.com/CIRFMF/ksef-docs/blob/main/kody-qr.md)
"(...) składa się z" (min.) :
a) typu identyfikatora kontekstu: "Nip", "InternalId", "NipVatUe", "PeppolId"
b) wartości identyfikatora kontekstu,
c) NIP-u sprzedawcy,
d) numeru seryjnego certyfikatu KSeF.
Tutaj (https://github.com/CIRFMF/ksef-docs/blob/main/uwierzytelnianie.md) czytam:

  • "Kontekst logowania – określa podmiot, w imieniu którego wykonywane będą operacje w systemie(...)"
    wydaje mi się więc, że:
    a), b) i c) wynikać powinny z danych związanych z challange, gdzie:
    a) i b) z authSubjectIdentifierType i authContextIdentifier
    c) z contextIdentifierValue
    d) może wynikać tylko z certyfikatu wystawcy (contextIdentifierValue) bo "pełni funkcję potwierdzenia autentyczności wystawcy" (z opisu dla Kod II).
RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

Jam niegodny odpowiedzi bo pewnie już o to ktoś pytał... Jeśli nadamy uprawnienia kilku podmiotom do wystawiania faktur, czy jest możliwość sprawdzenia kto wystawił konkretną fakturę?

JK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Jeśli wydrukuję fakturę przed wysłaniem do ksef to musi tam być QR1 z labelem "offline" i QR2 z certyfikatem. Ale jeśli potem tę fakturę wyślę do ksef to na wizualizacji dalej będzie musiałbyć ten QR1 "offline" i QR2 czy mogę już wydrukować QR1 z numerem ksef i bez QR2? Czy tak samo będzie dla wszystkich rodzajów offline (offline 24, awaria i co tam jeszcze jest)?

I jeszcze jedno pytanie - jakiej wersji QR używacie do QR1 i QR2? W https://github.com/CIRFMF/ksef-docs/blob/main/kody-qr.md nic na ten temat nie ma. Jakiś testowy QR1 zmieścił mi się w wersji 5, QR2 w wersji 14, ale chcę mieć jakiś zapas i z drugiej strony nie dawać wersji 40 bo to będzie przesada

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

Kolejna pytanie z gatunku "czy ty już nie masz większych problemów"
Czy pobierając status sesji /api/v2/sessions/{referenceNumber} trafiliście na kody inne niż te wymienione w dokumentacji? Dla ustalenia uwagi wymienione poniżej. Dodatkowo chciałbym się upewnić czy dobrze rozumiem zakresy statusów:
100 sesja otwarta
100-200 request o zamknięcie sesji wysłany ale ksef jeszcze mieli content wysłany w trakcie sesji
200 request o zamknięcie sesji wysłany i udało się wszystko poprawnie przetworzyć
400-500 request o zamknięcie sesji wysłany i content przetworzony ale coś jest nie tak z wysłanymi danymi
500 cholera wie, coś się srogo wysypało (czy ten status może wystąpić przed requestem o zamknięcie sesji?)

Sesja wsadowa:

Code Description
100 Sesja wsadowa rozpoczęta
150 Trwa przetwarzanie
200 Sesja wsadowa przetworzona pomyślnie
405 Błąd weryfikacji poprawności dostarczonych elementów paczki
415 Błąd odszyfrowania dostarczonego klucza
420 Przekroczony limit faktur w sesji
430 Błąd dekompresji pierwotnego archiwum
435 Błąd odszyfrowania zaszyfrowanych części archiwum
440 Sesja anulowana, przekroczono czas wysyłki
445 Błąd weryfikacji, brak poprawnych faktur
500 Nieznany błąd ({statusCode})
Sesja interaktywna:
Code Description
100 Sesja interaktywna otwarta
170 Sesja interaktywna zamknięta
200 Sesja interaktywna przetworzona pomyślnie
415 Błąd odszyfrowania dostarczonego klucza
440 Sesja anulowana, nie przesłano faktur
445 Błąd weryfikacji, brak poprawnych faktur
** description missing
JN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Hej! Czy jakaś mądra głowa pokonała podpisywanie certyfikatem z kluczem ecdsa na .net framework? System.Security.Cryptography.Xml działa świetnie dla kluczy RSA, niestety ECDSA wygląda na to, że nie ma wsparcia :(

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Hej, czy moglibyście mi wskazać jakich certyfikatów należy używać do autoryzacji na środowisku Demo? I kiedy i jak będzie możliwość o nie wystąpić? Wygenerowaliśmy je jak na razie z MCU, ale dają możliwość do autoryzacji tylko na środowisku testowym... Demo je odrzuca.

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

Temat kodu QR II ciągnę

W tym kodzie znajduje się, jak już ustaliliśmy, typ kontekstu i kontekst logowania, z którego faktura będzie wysłana.

No ale teraz taka rzecz: jeśli mam IdWew, to fakturę mogę równie dobrze wysłać jako NIP i jako IdWew. Wszak oba mają uprawnienie i oba mają dostęp do tej samej faktury. A może się mylę?
Niemniej, skąd generując kod QR II mam wiedzieć, który kontekst ją wyśle?

M2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Mam problem z otwarciem sesji interaktywnej. Wywołanie API normalnie zwraca referenceNumber ale kiedy sprawdzam status sesji to dostaję status 415.

Kopiuj
        $certificates  = $this->getPublicCertificateToEncryptInvoices();

        $ksefInvoiceCertificate = $certificates[1];

        $certificateBase64 = $ksefInvoiceCertificate->certificate;
        $certDer = base64_decode($certificateBase64);

        $certPem = "-----BEGIN CERTIFICATE-----\n" . chunk_split($certificateBase64, 64, "\n") . "-----END CERTIFICATE-----\n";

        $cert = openssl_x509_read($certPem);
        $publicKey = openssl_pkey_get_public($cert);

        $symmetricKey = random_bytes(32); 

        $encryptedKey = '';
        openssl_public_encrypt(
            $symmetricKey,
            $encryptedKey,
            $publicKey,
            OPENSSL_PKCS1_OAEP_PADDING
        );

        $symmetricKeyBase64 = base64_encode($symmetricKey);


        $initializationVector = base64_encode(random_bytes(16));

        $data = [
            'formCode' => [
                'systemCode' => 'FA (3)',
                'schemaVersion' => '1-0E',
                'value' => 'FA'
            ],
            'encryption' => [
                'encryptedSymmetricKey' => $symmetricKeyBase64,
                'initializationVector' => $initializationVector
            ]
        ];

        $ch = curl_init('https://ksef-test.mf.gov.pl/api/v2/sessions/online');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

        $headers = [
            'Authorization: Bearer ' . $authToken,
            'Content-Type: application/json'
        ];

N1ebieski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Dostałem właśnie newslettera z wFirma z FAQ w sprawie KSEF > https://pomoc.wfirma.pl/-ksef-czyli-krajowy-system-e-faktur#19-Krajowy-System-e-Faktur---FAQ

Przypomnę, że wFirma to bardzo popularna aplikacja webowa w modelu SaaS do zarządzania księgowością.

Szczególnie ciekawy jest punkt 6:

Czy możliwe będzie wgranie certyfikatu KSeF w systemie?

Tak, wdrożenie jest planowane na 1 lutego 2026 r. Termin ten jest zgodny z datą uruchomienia nowej wersji KSeF 2.0 przez Ministerstwo Finansów. Od tego dnia zacznie obowiązywać nowe rozwiązanie autoryzacyjne – certyfikaty KSeF. Można je pobierać od 01.11.2025 r., a używać od 01.02.2026 r. Obecnie autoryzacji można dokonać za pomocą tokenów lub wgrania podpisanego pliku metadanych (druga metoda dostępna wyłącznie dla osób posiadających uprawnienia właścicielskie).

Zakładam, że zatrudniają najlepszych specjalistów od cyberbezpieczeństwa w IT. Jeśli oni decydują się przechowywać certyfikaty u siebie na serwerze to sorry, ale przestałem mieć skrupuły.

Także, @Grzegorz Molenda tak jak Ci pisałem, zasady zasadami, a rzeczywistość swoje. Nikt kto dostarcza oprogramowanie nie będzie bawił się w żadne uprawnienia. To dobre dla wewnętrznych systemów księgowych.

M2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

@N1ebieski zapytam tylko czym w tej lini $pub = PublicKeyLoader::load($ksefPublicKey->value); jest u Ciebie $ksefPublicKey->value?

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

@jm0x01 i dla innych - chyba opanowałem QR2:

Kopiuj
function BytesToHex(const aBytes: array of Byte): String;
var
	b: Byte;
begin
	Result := '';
	for b in aBytes do
		Result := Result + b.ToHexString(2);
end;

function Base64ToURLEncode(const s: String): String;
begin
	Result := StringReplaceEx(s,
		['+', '/', '='],

		['-', '_', ''],

		[rfReplaceAll])
end;

function GenKSeF_QR2(const aNIP: String; const aHash: TBytes): String;
var
	Crypto: TSBxPublicKeyCrypto;
	KeyManager: TSBxCryptoKeyManager;
	CertificateManager: TSBxCertificateManager;
	InStream: TMemoryStream;
	OutStream: TStringStream;
	crtStream: TMemoryStream;
	ToSign: String;
	ToSignBytes: TBytes;
begin
	if Length(aHash) = 0 then
		Exit('');

	with Form_KseFOfflineCertSel.TfrmKSeFOfflineCertSel.Create(nil) do
		try
			if ShowModal <> 1 {mrOk} then
				raise EAbort.Create('User abort');

			ToSign := ToolsEk.StringReplaceEx(
				GetValueAsString('KSeF_QR2_pre'),

				['{nip}',
				'{context_type}',
				'{context_id}',
				'{cert_serial}',
				'{hash}'],

				[aNIP.Replace('-', '', [rfReplaceAll]).Trim,
				'Nip',
				aNIP.Replace('-', '', [rfReplaceAll]).Trim,
				BytesToHex(SelectedCert.Cert.SerialNumber),
				Base64ToURLEncode( TNetEncoding.Base64.EncodeBytesToString(aHash) )
				],

				[rfReplaceAll, rfIgnoreCase]);
			ToSignBytes := THashSHA2.GetHashBytes(ToSign, SHA256);

			//podpisywanie
			OutStream := TStringStream.Create('');
			try
				Crypto := TSBxPublicKeyCrypto.Create(nil);
				InStream := TMemoryStream.Create();
				crtStream := TMemoryStream.Create;
				try
					InStream.WriteData(ToSignBytes, Length(ToSignBytes));
					InStream.Position := 0;

					Crypto.InputEncoding := cetBinary;
					Crypto.OutputEncoding := cetBase64;

					CertificateManager := TSBxCertificateManager.Create(nil);
					try
						crtStream.Clear;
						SelectedCert.Cert.SaveToStreamPFX(crtStream, SelectedCert.Pass);

						crtStream.Position := 0;
						CertificateManager.ImportFromStream(crtStream, SelectedCert.Pass);

						KeyManager := TSBxCryptoKeyManager.Create(nil);
						try
							KeyManager.Certificate := CertificateManager.Certificate;

							KeyManager.ImportFromCert;

							Crypto.Key := KeyManager.Key;
						finally
							FreeAndNil(KeyManager);
						end;
					finally
						FreeAndNil(CertificateManager);
					end;

					Crypto.SignStream(InStream, OutStream, True);
				finally
					FreeAndNil(Crypto);
					FreeAndNil(InStream);
					FreeAndNil(crtStream);
				end;

				// dołączanie podpisu
				Result := ToolsEk.StringReplaceEx(
					GetValueAsString('KSeF_QR2_pre'),

					['{nip}',
					'{context_type}',
					'{context_id}',
					'{cert_serial}',
					'{hash}'],

					[aNIP.Replace('-', '', [rfReplaceAll]).Trim,
					'Nip',
					aNIP.Replace('-', '', [rfReplaceAll]).Trim,
					BytesToHex(SelectedCert.Cert.SerialNumber),
					Base64ToURLEncode(TNetEncoding.Base64.EncodeBytesToString(aHash))
					],

					[rfReplaceAll, rfIgnoreCase]);

				Result :=
					ToolsEk.StringReplaceEx(
						GetValueAsString('KSeF_QR2'),

						['{QR2_pre}',
						'{sign}'],

						[Result,
						Base64ToURLEncode(OutStream.DataString)],

						[rfReplaceAll, rfIgnoreCase]);
			finally
				FreeAndNil(OutStream);
			end;
		finally
			Free;
		end;
end;

Certyfikat to TElX509Certificate.
Musiałem użyć jednak nowych SB - nie umiałem tego zrobić z wersją BackwardCompatibility.

W krokach:

  1. Do podpisu: ksef-test.mf.gov.pl/client-app/certificate/Nip/5170359458/5170359458/01B8A216A01D7C21/l2frwaawjjz-TQm8PwgqvVtCKqPAjldLyQre7tBmw-A
  2. Hash: 10, 50, 23, 63, 211, 122, 255, 113, 244, 232, 244, 199, 108, 153, 173, 26, 89, 199, 232, 89, 239, 95, 157, 48, 67, 44, 100, 194, 8, 171, 181, 34
  3. Wynik wszystkiego (RSA-PSS): https://ksef-test.mf.gov.pl/client-app/certificate/Nip/5170359458/5170359458/01B8A216A01D7C21/l2frwaawjjz-TQm8PwgqvVtCKqPAjldLyQre7tBmw-A/q-VWoCDrKK2dq1mXl9Ky17PBlicHJmSHsZPrk-zsY8g7lIobFqeGPevmnxKqfK0KKTnzQLuhMy5T-4DK5-jfUe1FVzm1MRcYoDobsgWjyF0qqpoor56xkOeBuNvBce9Xf0fBimBNzck3Z6bUaYTaOz-jGF2IRzbQBp0GzJ3If5On4g2vPmOLCxOHaA6Sb5NFCNLzDet446iR76rYXV41j6-p5BeMwkA2HF7FA1FtlWF0tZu8E3gIZGJbsyt47OndoP32SociCmm2gItziNSzCszTN7jwvzU0Me2xwoveDuIlZO0DbqasYcrgiEZy-qkm_VomEJ81-8bJ91knIpw8nQ i kupa :(

EDIT - udało się z PSS wreszcie (ECDSA będę męczył później). Nie wiem czemu, ale kod który się z pozoru wydaje poprawny daje błedny wynik. Ale przypadkowo odkryłem bardzo (nie)wygodną funkcję "na raz":

Kopiuj
ToSignBytes := THashSHA2.GetHashBytes(ToSign, SHA256);

SelectedCert.Cert.SaveKeyToStream(Key);

outBytesSize := SelectedCert.Cert.KeyMaterial.Bits div 8;
SetLength(OutBytes, outBytesSize);

SBRSA.SignPSS(ToSignBytes, Length(ToSignBytes), SB_ALGORITHM_DGST_SHA256, 32, Key.Memory, Key.Size, outBytes, outBytesSize, nil);

OutStream.WriteString( StringReplaceEx( TNetEncoding.Base64.EncodeBytesToString( outBytes ), [#13, #10], ['', ''], [rfReplaceAll]) );

Result :=
    ToolsEk.StringReplaceEx(
        GetValueAsString('KSeF_QR2'),

        ['{QR2_pre}',
        '{sign}'],

        [ToSign,
        Base64ToURLEncode(OutStream.DataString)],

        [rfReplaceAll, rfIgnoreCase]);
GS
  • Rejestracja: dni
  • Ostatnio: dni
0

Przy pomocy aplikacji MCU wygenerowałem i pobrałem certyfikat KSef (.cer).
Ale nie bardzo wiem jak go użyć.
Autoryzując się pieczęcią "selfsigned" generowałem zabezpieczony hasłem klucz prywatny (.pem) ,
generowałem żądanie certyfikatu (.csr), na końcu miałem wygenerowany przez siebie klucz prywatny oraz otrzymany z Ksef certyfikat (*.der) , następnie z obu tych elementów (certyfikat i klucz) tworzyłem certyfikat w formacie *.PFX.

A teraz mam plik *.cer oraz użyte do jego zabezpieczenia hasło. Nie mam klucza prywatnego

TH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Część,
mam parę pytań, może ktoś też ma/miał taki problem.
Włączyli już aplikacje klienta, więc wygenerowałem certyfikaty KSeF.
(https://mcu.mf.gov.pl/web)
Udało mi się poprawnie podpisać dokument autoryzacyjny, ale podczas sprawdzania statusu uwierzytelnienia dostaje błąd:

415 - Brak uprawnień.

Jestem właścicielem firmy, buduje jakby „nadrzędny” administracyjny certyfikat i nie mam na wejściu uprawnień?
Chyba, że jednak coś jest nie tak z podpisaniem dokumentu? Aczkolwiek wtedy powinien być inny błąd z błędnym podpisem.
A może certyfikaty KSeF nie działają na serwerze testowym (co byłoby dziwne).

edit1:
Jeśli certyfikaty KSeF działają na serwerze testowym - to czy jest jakieś rozgraniczenie na generowanie certyfikatu pod serwer testowy i produkcyjny? (tak było z tokenami jak dobrze pamiętam).

xoree
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
1

Dla potomnych :https://github.com/bsdnetpl/KSeFClient

E5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Czy ktoś zastanawiał się/już przerabiał taką zagwozdkę: firma posiada kilka oddziałów rozmieszczonych w dużych odległościach, a co za tym idzie, mających różne sekretariaty. Przykładowo: sekretariat z Gdańska chce otrzymywać jedynie "swoje" faktury (koszt wygenerowany przez ten oddział), z Warszawy "swoje" - nie jest pożądane, aby sekretariaty widziały faktury innych oddziałów. Przy czym to są oddziały jednej spółki, zatem NIP jest ten sam. Pobierając z Ksef faktury zakupowe tej spółki pobieramy wszystkie, tj. wszystkich oddziałów. Wydaje mi się, że przewijał się temat identyfikatorów wewnętrznych w tym kontekście, natomiast w dokumentacji Ksef 2.0 natrafiam mniej więcej w tym temacie jedynie na GV oraz JST. Czy ma ktoś doświadczenie w tego typu potrzebach biznesowych?

xoree
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0
EZ_55 napisał(a):

Czy ktoś zastanawiał się/już przerabiał taką zagwozdkę: firma posiada kilka oddziałów rozmieszczonych w dużych odległościach, a co za tym idzie, mających różne sekretariaty. Przykładowo: sekretariat z Gdańska chce otrzymywać jedynie "swoje" faktury (koszt wygenerowany przez ten oddział), z Warszawy "swoje" - nie jest pożądane, aby sekretariaty widziały faktury innych oddziałów. Przy czym to są oddziały jednej spółki, zatem NIP jest ten sam. Pobierając z Ksef faktury zakupowe tej spółki pobieramy wszystkie, tj. wszystkich oddziałów. Wydaje mi się, że przewijał się temat identyfikatorów wewnętrznych w tym kontekście, natomiast w dokumentacji Ksef 2.0 natrafiam mniej więcej w tym temacie jedynie na GV oraz JST. Czy ma ktoś doświadczenie w tego typu potrzebach biznesowych?

Problem, który opisujesz, pojawia się w wielu firmach mających kilka oddziałów działających pod jednym NIP-em. Niestety KSeF – zarówno w wersji obecnej, jak i 2.0 – nie oferuje natywnego podziału faktur na oddziały, o ile wszystkie funkcjonują pod tym samym numerem NIP.
Mechanizmy typu GV czy JST odnoszą się do zupełnie innych scenariuszy i nie rozwiązują tego przypadku.

Co to oznacza w praktyce?

Pobierając faktury przy użyciu NIP, otrzymujesz pełny zestaw dokumentów całej firmy, bez możliwości filtrowania według oddziału na poziomie KSeF.

Jak poradzić sobie z tym w praktyce?

  1. Stosowanie identyfikatorów wewnętrznych (tagów oddziałów)

Najczęstsze i najprostsze rozwiązanie.

W firmie ustalasz, że każdy oddział ma swój kod/skrót, np.

GDA – Gdańsk

WAW – Warszawa

KRK – Kraków

Wystawiając fakturę (kosztową i sprzedażową), dodajesz ten kod:

W polu Opis,

W polu Uwagi,

W pozycji wartość własna ERP,

lub w dedykowanym elemencie rozszerzeń (jeżeli ERP na to pozwala).

Po pobraniu faktury z KSeF Twój system ERP lub middleware odczytuje tag i kieruje dokument do właściwego sekretariatu.

To jest dziś najczęściej stosowany standard i praktycznie jedyne pewne rozwiązanie.

  1. Mapowanie oddziałów na podstawie danych kontrahenta

Jeśli dostawcy wystawiają faktury na adres oddziału (różne adresy, choć ten sam NIP), można:

parsować sekcję <AdresPodmiotu> / <AdresPodmiotuNabywcy>

rozpoznawać po kodzie pocztowym/ulicy, który oddział wygenerował koszt.

To działa tylko wtedy, gdy kontrahenci konsekwentnie wpisują właściwy adres oddziału.

  1. System pośredni (middleware) jako filtr i router faktur

Firmy z bardziej rozbudowaną strukturą stosują:

własny moduł integracyjny,

bazę reguł (np. przypisanie działów na podstawie prefixu w numerze zamówienia, adresu dostawy, kodu projektu itd.).

KSeF daje wszystkie faktury, a routing odbywa się w Twoim systemie, według ustalonych kryteriów.

  1. (Mniej popularne, ale możliwe) Wyodrębnienie oddziałów organizacyjnych z własnymi kontami KSeF

Nie chodzi o NIP – on pozostaje jeden – ale o:

różne konta użytkowników,

różne tokeny,

różne poziomy uprawnień.

Wciąż jednak każdy użytkownik z uprawnieniem do pobierania zobaczy wszystkie faktury, dlatego poniższe rozwiązanie stosuje się rzadko:

Każdy sekretariat pobiera faktury przez własny system (lub własne API), a sam system filtruje dane lokalnie przed wyświetleniem.

Z punktu widzenia KSeF nic to nie zmienia – nadal KSeF zwraca pełny strumień faktur.

Podsumowanie

KSeF nie zapewnia natywnego podziału faktur na oddziały w ramach jednego NIP. (chyba)

Aby sekretariaty widziały tylko “swoje” faktury, trzeba:

oznaczać dokumenty identyfikatorem oddziału (najlepsze rozwiązanie),

lub dzielić je po adresie,

lub filtrować je we własnym systemie po pobraniu z KSeF.

Jeszcze jedno praktyczne rozwiązanie, które dobrze działa przy wielu oddziałach pod jednym NIP-em: numeracja faktur z kodem oddziału.

Skoro KSeF nie rozróżnia oddziałów (jeden NIP = jeden strumień faktur), to podział robimy logiką biznesową + numeracją. Przykład:

Gdańsk: 123/GDA/03/2025

Warszawa: 45/WAW/03/2025

Kraków: 7/KRK/03/2025

KSeF przyjmie taki numer bez problemu, byle był unikalny w skali firmy/roku.
Potem po stronie bazy/appki robisz po prostu filtrowanie po numer_faktury.

E5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0
xoree napisał(a):
EZ_55 napisał(a):

Czy ktoś zastanawiał się/już przerabiał taką zagwozdkę: firma posiada kilka oddziałów rozmieszczonych w dużych odległościach, a co za tym idzie, mających różne sekretariaty. Przykładowo: sekretariat z Gdańska chce otrzymywać jedynie "swoje" faktury (koszt wygenerowany przez ten oddział), z Warszawy "swoje" - nie jest pożądane, aby sekretariaty widziały faktury innych oddziałów. Przy czym to są oddziały jednej spółki, zatem NIP jest ten sam. Pobierając z Ksef faktury zakupowe tej spółki pobieramy wszystkie, tj. wszystkich oddziałów. Wydaje mi się, że przewijał się temat identyfikatorów wewnętrznych w tym kontekście, natomiast w dokumentacji Ksef 2.0 natrafiam mniej więcej w tym temacie jedynie na GV oraz JST. Czy ma ktoś doświadczenie w tego typu potrzebach biznesowych?

Problem, który opisujesz, pojawia się w wielu firmach mających kilka oddziałów działających pod jednym NIP-em. Niestety KSeF – zarówno w wersji obecnej, jak i 2.0 – nie oferuje natywnego podziału faktur na oddziały, o ile wszystkie funkcjonują pod tym samym numerem NIP.
Mechanizmy typu GV czy JST odnoszą się do zupełnie innych scenariuszy i nie rozwiązują tego przypadku.

Co to oznacza w praktyce?

Pobierając faktury przy użyciu NIP, otrzymujesz pełny zestaw dokumentów całej firmy, bez możliwości filtrowania według oddziału na poziomie KSeF.

Jak poradzić sobie z tym w praktyce?

  1. Stosowanie identyfikatorów wewnętrznych (tagów oddziałów)

Najczęstsze i najprostsze rozwiązanie.

W firmie ustalasz, że każdy oddział ma swój kod/skrót, np.

GDA – Gdańsk

WAW – Warszawa

KRK – Kraków

Wystawiając fakturę (kosztową i sprzedażową), dodajesz ten kod:

W polu Opis,

W polu Uwagi,

W pozycji wartość własna ERP,

lub w dedykowanym elemencie rozszerzeń (jeżeli ERP na to pozwala).

Po pobraniu faktury z KSeF Twój system ERP lub middleware odczytuje tag i kieruje dokument do właściwego sekretariatu.

To jest dziś najczęściej stosowany standard i praktycznie jedyne pewne rozwiązanie.

Obawiam się, że nie jest to dobre rozwiązanie, bo z tego co wiem, nie ma możliwości "wymuszenia" na kontrahencie dodania konkretnej frazy np. do pola Opis. Mogę poprosić i liczyć na to, że oprogramowanie kontrahenta to umożliwia i faktycznie taką danę zamieści w danym polu. Ale jest to tylko jego dobra chęć, gdzie wątpię że firmy wystawiające dużą ilość faktur będą każdy przypadek rozważać indywidualnie i się zastanawiać czy dany kontrahent ma jakieś konkretne wymagania co do wartości w polu Opis.

  1. Mapowanie oddziałów na podstawie danych kontrahenta

Jeśli dostawcy wystawiają faktury na adres oddziału (różne adresy, choć ten sam NIP), można:

parsować sekcję <AdresPodmiotu> / <AdresPodmiotuNabywcy>

rozpoznawać po kodzie pocztowym/ulicy, który oddział wygenerował koszt.

To działa tylko wtedy, gdy kontrahenci konsekwentnie wpisują właściwy adres oddziału.

Jest to jakiś pomysł, ale własnie, jak zauważyleś, zadziała jedynie to jedynie jeżeli kontrahent uzupełni poprawny adres. Poza tym wyobrażam sobie sytuację, w której kontrahent wystawiający fakturę ma w swoim systemie zapisany jakiś adres główny siedziby spółki (przykładowo ten warszawski), a faktura dotyczy zamówienia oddziału gdańskiego.

  1. System pośredni (middleware) jako filtr i router faktur

Firmy z bardziej rozbudowaną strukturą stosują:

własny moduł integracyjny,

bazę reguł (np. przypisanie działów na podstawie prefixu w numerze zamówienia, adresu dostawy, kodu projektu itd.).

KSeF daje wszystkie faktury, a routing odbywa się w Twoim systemie, według ustalonych kryteriów.

To połączenie poprzednich 2 punktów. Kod projektu - super, ale znów nie mamy wpływu na to, w jaki sposób kontrahent wystawi fakturę i czy umieści odpowiednią danę w odpowiednim miejscu. Jak wspominałem w pkt. 1 - raczej wątpię.

  1. (Mniej popularne, ale możliwe) Wyodrębnienie oddziałów organizacyjnych z własnymi kontami KSeF

Nie chodzi o NIP – on pozostaje jeden – ale o:

różne konta użytkowników,

różne tokeny,

różne poziomy uprawnień.

Wciąż jednak każdy użytkownik z uprawnieniem do pobierania zobaczy wszystkie faktury, dlatego poniższe rozwiązanie stosuje się rzadko:

Każdy sekretariat pobiera faktury przez własny system (lub własne API), a sam system filtruje dane lokalnie przed wyświetleniem.

Z punktu widzenia KSeF nic to nie zmienia – nadal KSeF zwraca pełny strumień faktur.

To się ma nijak do Ksef - jeżeli Adam Nowak z oddziału warszawskiego posiada uprawnienia do podglądu faktur spółki, Anna Kowalska z oddziału gdańskiego również posiada uprawnienia do podglądu faktur spółki, to obydwoje zobaczą to samo, tj. wszystkie faktury spółki.
Pomijam, że w Ksef nie ma "kont użytkowników".
Tokeny rozumiem dostępowe? Jeżeli tak, to one służą jedynie uwierzytelnieniu w kontekście całej spółki. Na token nadajesz uprawnienie do podglądu faktur i korzystając z tego tokenu widzisz wszystkie faktury spółki.
Poziomy uprawnień - no własnie byłoby dobrze jeżeli w Ksef byłaby jakaś możliwość tworzenia jakiś oddziałów i zarządzania dostępem do nich, ale w ramach 1 NIPu w uprawnieniach możesz zarządzić czy dana osoba ma posiadać dostęp do podglądu wszystkich faktur czy żadnej.

Podsumowanie

KSeF nie zapewnia natywnego podziału faktur na oddziały w ramach jednego NIP. (chyba)

Aby sekretariaty widziały tylko “swoje” faktury, trzeba:

oznaczać dokumenty identyfikatorem oddziału (najlepsze rozwiązanie),

lub dzielić je po adresie,

lub filtrować je we własnym systemie po pobraniu z KSeF.

Jeszcze jedno praktyczne rozwiązanie, które dobrze działa przy wielu oddziałach pod jednym NIP-em: numeracja faktur z kodem oddziału.

Skoro KSeF nie rozróżnia oddziałów (jeden NIP = jeden strumień faktur), to podział robimy logiką biznesową + numeracją. Przykład:

Gdańsk: 123/GDA/03/2025

Warszawa: 45/WAW/03/2025

Kraków: 7/KRK/03/2025

KSeF przyjmie taki numer bez problemu, byle był unikalny w skali firmy/roku.
Potem po stronie bazy/appki robisz po prostu filtrowanie po numer_faktury.

Numeracja faktur z oddziałami - w kontekście FVS ok, jest to jakieś rozwiązanie. Ale mi chodzi głównie o pobieranie i "przydzielanie do odpowiednich osób" FVZ. Takie faktury rzecz jasna posiadają numerację jaką narzucil wystawca faktury.

Reasumując - dzięki za obszerny opis, ale wydaje mi się, że żadne z powyższych rozwiązań nie jest pewne.

AdrianWladyka
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Co za chory umysł wymyśli tego KSEFa ....

jeżeli dobrze rozumiem .. by wysyłać faktury do KSEF to normalnie ściągam sobie certyfikat z MCU i na nim działam .. póki co mi to śmiga.

Ale żeby zrobić offline to musze uzyskać certyfikat z całkowicie innego miejsca? Lub inny sposób podpisać ten uzyskany z MCU.

Ma ktoś jakąś radę dobrego wujka, skąd to wszystko uzyskać (na chwile obecną testowo)? tak krok po kroku...

SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
0

Się pogubiłem, Inicjuję sesję wsadową, dzielę zipa na pliki binarne, wywołuję endpoint session/batch, dostaję kod 201, czyli bangla, mój plik ma dokładnie jeden plik binarny, więc dostaję jeden link, wysyłam pod ten link, dostaję 201, znaczy coś poszło, zamykam sesję wsadową i dostaję 204 no content, ale według dokumentacji to jest okej... i co teraz? Spodziewałem się że w którymś momencie gdzieś dostanę jakąś informację że mój chunk jest nieprawidłowy, ale ani w invoices/failed nic nie ma, ani przy pobraniu metadanych

TH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Mam jeszcze jedno zasadnicze pytanie do Was, bo nie rozumiem generalnie pewnej koncepcji uwierzytelniania na podstawie certyfikatów KSeF.
Może już to gdzieś było omawiane, może na jakiś "szkoleniach" dla integratorów - ale przyznam się bez bicia, że nie uczęszczałem.

Dajmy na to mamy JDG i mamy wygenerowany certyfikat KSeF i dzięki niemu uwierzytelniamy się - ale jest to mój prywatny certyfikat, pod mój NIP i PESEL.
A co się dzieje w momencie nadanie uprawnienia na inny PESEL? Chcę dać jakieś uprawnienia np. księgowej na inny PESEL.
Ta osoba będzie musiała mieć nadany osobny certyfikat i nim się uwierzytelniać?
No bo jakoś musimy wiedzieć, że dany PESEL ma np. inne uprawnienia itd.

Pytam dlatego, że myślałem, że to będzie na takiej zasadzie, że każda uprawniona osoba będzie miała swój osobny certyfikat (tak było kiedyś z tokenami, tworzyło się osobny token z innymi uprawnieniami i po temacie) - a patrząc na MCU ja mogę wygenerować tylko mój jeden certyfikat jako właściciela pod NIP+PESEL.
Nadałem uprawnienia innej osobie na MCU pod PESEL - ale jak system będzie wiedział, że to ta konkretna osoba?

Nie łapie na razie tej logiki uwierzytelnienia i nadawania uprawnień.
W JDG to jeszcze pół biedy, ale jak są firmy po 200 pracowników?

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

@Krzysztof Stasiak [oddzielny post bo się nie mieszczę ze swoimi żalami w komentarzu].
Doszedłem do tego samego wniosku. Jak dla mnie jest sporo dziur w tym rozwiązaniu z certyfikatami. Jeśli nie masz pieczęci i ktoś poza Tobą musi mieć dostęp to nie ma innej opcji jak przypisać mu uprawnienia żeby ta osoba wyrobiła sobie cert. Po pierwsze upierdliwe jeśli musi to robić szeregowy sprzedawca wystawiający faktury w sklepie. Wyjaśnienie: Właściciel sklepu po zalogowaniu do MCU za pomocą Profilu zaufanego (bo nie ma pieczęci) nadaje pracownikowi uprawnienia do wystawiania faktur. Właściciel nie może wyrobić certyfikatu "na siebie" z intencją użycia go w oprogramowaniu do wystawiania faktur bo to wg dokumentacji niedopuszczalne - taki certyfikat jest na PESEL właściciela a nie na NIP firmy. No ale ok, teraz też pracownik po wystawieniu faktury nie może podrobić podpisu szefa na wydrukowanej fakturze. Z tego punktu widzenia można purystów ideologicznych zrozumieć, że konieczne jest upoważnienie konkretnego pracownika w MCU żeby mógł on wyrobić sobie certyfikat. Ale...
Taki upoważniony pracownik może sobie po pijaku albo wkurzony albo z głupoty... cokolwiek zalogować się do aplikacji podatnika i wystawić 1000500100900 faktur (bo ma uprawnienia). Jak to ktoś zobaczy w systemie to nawet nie ma możliwości sprawdzenia który z uprawnionych pracowników to zrobił. Nie mówię, że takie problemy nie istnieją w tym momencie, ale obecny mechanizm certyfikatów i połączone z nim zasady wręcz zachęcają do tworzenia taki problemów.
Czyli w praktyce, żeby nie rozdawać uprawnień na prawo i lewo trzeba bulić za pieczęć (przecież przedsiębiorcy w tym kraju mogli już się przyzwyczaić do ukrytych kosztów 😉 ) i na jej podstawie wyrabiać certyfikaty.

TA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Wykonuję https://ksef-test.mf.gov.pl/api/v2/auth/challenge zwraca 200
Potem https://ksef-test.mf.gov.pl/api/v2/auth/ksef-token

  • token usera mam z apki online, używam całego łącznie z początkową datą;
  • z timestamp biorę 3 lub 7 znaków
  • encryptedToken wcyiągam z pliku base64_out.txt:
    openssl pkeyutl -encrypt -inkey publicKey.pem -pubin -in tekst_in.txt -out tekst_out.txt
    openssl base64 -in tekst_out.txt -out base64_out.txt
    zwraca 202
    Ale przy https://ksef-test.mf.gov.pl/api/v2/auth/{referenceNumber}
  • nadaję nagłówek (nawet jak go opuszczę to też 401): RRequest.Params.AddHeader('Authorization', 'Bearer ' + authenticationToken);
    zwraca 401
    Tu taka uwaga: w publicKey.pem mam klucz publiczny z KSEF 1.0, bo z pobranego cck-ksef.crt nie mogę wyodrębnić klucza.
    Próbuję openssl x509 -in cckksef.crt -pubkey -noout > publickey.pem
    ale wtedy openssl wyrzuca błąd przy podpisywaniu.

Co robię nie tak?
Możecie podrzucić dobry klucz publiczny?

Dzięki

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Mam pytanie dotyczące KSEF dla JST ( z jednostkami organizacyjnymi)- np gmina i zakład wodkan, szkoły itd. Wg podręcznika (część 4 ) istnieją dwie metody opisania takiej struktury - nip JST + IdWew albo Nip jednostki podrzędnej i zaznaczenie JST w fakturze. Czy te metody można mieszać, np faktury zakupu byłyby wystawiane na NIP JST+IdWew a faktury sprzedaży Nip jednostki podrzędnej i zaznaczenie JST w fakturze?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.