Skip to content

KSeF - National e-Invoice System

KSeF ist eine Plattform des polnischen Finanzministeriums für strukturierte Rechnungen. Das Plugin bereitet Ihren Shop auf die KSeF-Integration vor - es erkennt Bestellungen, die eine MwSt.-Rechnung erfordern, fügt eine Statusspalte und Hooks für die Integration mit Fakturierungssystemen hinzu.

KSeF befindet sich in der Einführungsphase. Das Plugin stellt keine Rechnungen in KSeF aus, erleichtert aber die Integration mit Systemen, die dies tun (z. B. Fakturownia, iFirma, wFirma, InFakt).

Hauptfunktionen des KSeF-Moduls:

  1. Automatische Erkennung von Bestellungen mit einer NIP-Nummer
  2. KSeF-Statusspalte in der Bestellliste
  3. Hooks für die Integration mit externen Fakturierungssystemen
  4. Bestell-Metadaten, bereit zur Übergabe an das KSeF-System

Wenn ein Kunde bei der Bestellaufgabe eine NIP angibt (das NIP-Feld ist Teil des Checkout-Moduls), führt das Plugin automatisch Folgendes aus:

  1. Validiert das NIP-Format (10 Ziffern, Prüfsummenverifizierung)
  2. Markiert die Bestellung als eine, die eine MwSt.-Rechnung erfordert
  3. Speichert die NIP in den Bestell-Metadaten
  4. Ruft optional Unternehmensdaten aus der GUS/CEIDG-API ab

Das Plugin prüft die Korrektheit der NIP auf zwei Ebenen:

  • Format - 10 Ziffern, korrekte Prüfsumme (Gewichtungen: 6, 5, 7, 2, 3, 4, 5, 6, 7)
  • Online-Verifizierung - optionale Prüfung in der VIES-Datenbank (für EU-NIPs) oder GUS-API

In der Bestellliste (WooCommerce > Bestellungen) erscheint eine Spalte KSeF mit Statussymbolen:

SymbolStatusBeschreibung
GrauNicht zutreffendBestellung ohne NIP, keine Rechnung erforderlich
BlauAusstehendBestellung mit NIP, Rechnung auszustellen
GrünAusgestelltRechnung wurde ausgestellt (Status durch Hook gesetzt)
RotFehlerBei der Rechnungsausstellung ist ein Problem aufgetreten

Sie können Bestellungen nach KSeF-Status filtern, z. B. nur diejenigen anzeigen, die auf eine Rechnung warten.

In der Bestellliste können Sie mehrere Bestellungen gesammelt als “in KSeF ausgestellt” markieren.

Wird ausgelöst, wenn eine Bestellung mit NIP bezahlt und zur Rechnungsausstellung bereit ist. Der Haupt-Hook für die Integration mit Fakturierungssystemen.

/**
* @param int $order_id WooCommerce order ID.
* @param WC_Order $order Order object.
* @param string $nip Customer NIP number.
* @param array $invoice_data Invoice data (company name, address, NIP).
*/
add_action('polski/ksef/invoice_ready', function (int $order_id, WC_Order $order, string $nip, array $invoice_data): void {
// Example: send data to the Fakturownia API
$api_token = get_option('fakturownia_api_token');
$account = get_option('fakturownia_account');
$invoice_payload = [
'invoice' => [
'kind' => 'vat',
'number' => null, // auto-numbering
'sell_date' => $order->get_date_paid()->format('Y-m-d'),
'issue_date' => current_time('Y-m-d'),
'payment_type' => 'transfer',
'seller_name' => get_option('woocommerce_store_name'),
'buyer_name' => $invoice_data['company_name'],
'buyer_tax_no' => $nip,
'buyer_street' => $invoice_data['address'],
'buyer_city' => $invoice_data['city'],
'buyer_post_code' => $invoice_data['postcode'],
'positions' => [],
],
];
foreach ($order->get_items() as $item) {
$invoice_payload['invoice']['positions'][] = [
'name' => $item->get_name(),
'quantity' => $item->get_quantity(),
'total_price_gross' => $item->get_total() + $item->get_total_tax(),
'tax' => round(($item->get_total_tax() / $item->get_total()) * 100),
];
}
$response = wp_remote_post("https://{$account}.fakturownia.pl/invoices.json", [
'body' => wp_json_encode($invoice_payload),
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Token token=' . $api_token,
],
]);
if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 201) {
$body = json_decode(wp_remote_retrieve_body($response), true);
update_post_meta($order_id, '_ksef_status', 'issued');
update_post_meta($order_id, '_ksef_invoice_id', $body['id'] ?? '');
} else {
update_post_meta($order_id, '_ksef_status', 'error');
}
}, 10, 4);

Filter, mit dem Sie programmgesteuert bestimmen können, ob eine Bestellung eine KSeF-Rechnung erfordert.

/**
* @param bool $is_required Whether a KSeF invoice is required.
* @param WC_Order $order Order object.
* @return bool
*/
add_filter('polski/ksef/is_required', function (bool $is_required, WC_Order $order): bool {
// Example: require KSeF invoice for orders above 450 PLN
if ($order->get_total() > 450) {
return true;
}
return $is_required;
}, 10, 2);

Beispiel - automatische Statusmarkierung nach Integration

Section titled “Beispiel - automatische Statusmarkierung nach Integration”
/**
* Update KSeF status after receiving a response from the invoicing system.
*/
add_action('my_invoicing/invoice_created', function (int $order_id, string $ksef_number): void {
$order = wc_get_order($order_id);
if (!$order) {
return;
}
$order->update_meta_data('_ksef_status', 'issued');
$order->update_meta_data('_ksef_number', $ksef_number);
$order->add_order_note(
sprintf('Invoice issued in KSeF. KSeF number: %s', $ksef_number)
);
$order->save();
}, 10, 2);

Das KSeF-Modul speichert die folgenden Metadaten in Bestellungen:

Meta-SchlüsselBeschreibung
_billing_nipNIP-Nummer des Kunden
_billing_companyFirmenname
_ksef_requiredOb die Bestellung eine Rechnung erfordert (yes/no)
_ksef_statusRechnungsstatus (pending, issued, error)
_ksef_numberKSeF-Rechnungsnummer (nach Ausstellung)
_ksef_invoice_idRechnungs-ID im externen System

Einstellungen des KSeF-Moduls: WooCommerce > Einstellungen > Polski > KSeF.

OptionBeschreibungStandardwert
KSeF-Modul aktivierenAktiviert Erkennung und NachverfolgungJa
Online-NIP-ValidierungNIP in GUS/VIES-API prüfenNein
Unternehmensdaten automatisch abrufenDaten aus GUS nach Eingabe der NIP abrufenNein
Auslösestatus für HookBestellstatus, bei dem invoice_ready ausgelöst wirdprocessing

Die KSeF-Spalte wird nicht in der Bestellliste angezeigt Klicken Sie auf “Ansicht anpassen” und aktivieren Sie das Kontrollkästchen für die KSeF-Spalte. Stellen Sie sicher, dass das Modul in den Einstellungen aktiviert ist.

Die NIP wird nicht in der Bestellung gespeichert Prüfen Sie, ob das NIP-Feld unter WooCommerce > Einstellungen > Polski > Checkout aktiviert ist. Das Feld muss aktiv sein, damit Kunden es ausfüllen können.

Der Hook invoice_ready wird nicht ausgelöst Prüfen Sie die Einstellung “Auslösestatus für Hook”. Standardmäßig wird der Hook beim Status “In Bearbeitung” ausgelöst. Ändern Sie diese Option bei benutzerdefinierten Status.

Diese Seite dient ausschließlich zu Informationszwecken und stellt keine Rechtsberatung dar. Konsultieren Sie vor der Implementierung einen Anwalt. Polski for WooCommerce ist Open-Source-Software (GPLv2), die ohne Gewährleistung bereitgestellt wird.