Skip to content

Withdrawal from contract - Pro features

Die Pro-Version erweitert das kostenlose Widerrufsmodul um eine bedienergesteuerte Rückerstattungsabwicklung, Erklärungs-PDFs, ein Audit-Log, Berichte und Integrationen mit Abonnements / Produktbündeln. Sie setzt voraus, dass die kostenlose Version von Polski for WooCommerce aktiv ist und dass Sie mit dem grundlegenden Widerrufsmodul vertraut sind.

Automatische Rückerstattung (mit Bestätigung durch den Bediener)

Section titled “Automatische Rückerstattung (mit Bestätigung durch den Bediener)”

Niemals automatisch - eine Rückerstattung erfordert eine ausdrückliche Bedieneraktion auf dem Bestellbildschirm. In Edit order › Polski - withdrawal refund (Metabox rechts) sieht der Bediener:

  • Den berechneten Rückerstattungsbetrag auf Basis der ausgewählten Erklärungspositionen
  • Eine Schaltfläche Process refund now (mit einem JS-confirm() für eine doppelte Bestätigung)
  • Nach der Verarbeitung: die WooCommerce-Rückerstattungsnummer, den Betrag und das Datum

Logik:

  1. Ruft die Zeilen aus polski_withdrawal_items für die betreffende Erklärung ab
  2. Ordnet sie dem Format von wc_create_refund() zu (qty, refund_total, refund_tax)
  3. Fügt die Versandkosten nur hinzu, wenn der Widerruf alle Bestellzeilen abdeckt
  4. Ruft die Gateway-Rückerstattung (refund_payment => true) und das Wiedereinbuchen des Bestands (restock_items => true) auf
  5. Speichert refund_id und refund_amount in polski_withdrawals
  6. Löst polski_pro/withdrawal/refund_processed und WithdrawalService::complete() aus

Der Filter polski_pro/withdrawal/refund_payload erlaubt es Ihnen, das Payload vor wc_create_refund() zu ändern (zum Beispiel, um in bestimmten Fällen den Versand hinzuzufügen oder Steuern zu ändern).

A4-Erklärungs-PDF - dauerhafter Datenträger

Section titled “A4-Erklärungs-PDF - dauerhafter Datenträger”

Polski\Pro\Service\WithdrawalPdfGenerator verwendet TCPDF, um ein A4-PDF zu erzeugen mit:

  • Einer Erklärungsnummer POL-WD-NNNNNN und dem Einreichungsdatum
  • Dem Adressaten (Shop-Daten aus polski_general oder woocommerce_store_*)
  • Dem Verbraucher (Rechnungsvorname/-nachname, Adresse, E-Mail)
  • Dem Erklärungstext mit einem Verweis auf Art. 27 des Verbraucherrechtegesetzes
  • Einer Positionstabelle (Name + Variantenattribute, Menge, Wert)
  • Dem Bestellwert
  • Dem Bestelldatum
  • Dem Grund (falls der Kunde einen angegeben hat)
  • Einem Platz für eine Unterschrift (nur Papierversion)
  • Einem Hinweis zum dauerhaften Datenträger

Gespeichert unter wp-content/uploads/polski-withdrawals/YYYY/MM/POL-WD-NNNNNN.pdf (geschützt mit .htaccess deny from all).

Automatisch generiert bei jedem requested-/guest_requested-/manual_registered-Ereignis, an die Verbraucher-E-Mail angehängt über den Filter woocommerce_email_attachments. Der Pfad wird in der Bestell-Meta _polski_withdrawal_pdf gespeichert, nachfolgende ensurePdf()-Aufrufe sind idempotent (Neugenerierung nur, wenn die Datei nicht mehr vorhanden ist).

Überprüfung der Download-Anzahl (Lockerung nach Art. 16(m))

Section titled “Überprüfung der Download-Anzahl (Lockerung nach Art. 16(m))”

Bei zu 100 % digitalen Bestellungen behält der Verbraucher das Widerrufsrecht, selbst wenn Sie die Zustimmung nach Art. 16(m) eingeholt haben, sofern er keine Datei heruntergeladen hat. Der Dienst DigitalDownloadVerifier:

  1. Hängt sich in den Filter polski/withdrawal/eligible mit Priorität 30 ein (nach DigitalConsentService=20)
  2. Iteriert die Bestellpositionen, für jede herunterladbare/virtuelle Position summiert er die Downloads aus wc_get_customer_download_log pro Berechtigung
  3. Wenn keine Position count > 0 hat, stellt er die Widerrufsberechtigung wieder her (gibt true statt false zurück)
  4. Wenn mindestens eine heruntergeladen wurde, lässt er false bestehen

Aktiviert über polski_withdrawal['digital_download_verification'] = '1' in den Einstellungen (standardmäßig aus, Opt-in gemäß der Shop-Richtlinie).

Standardmäßig werden Abonnements nicht vom Widerruf ausgeschlossen (es sei denn, das Storefront setzt den Filter polski_pro/subscriptions/treat_as_exempt => true für das Legacy-Verhalten). Logik:

  • Wenn eine Erklärung abgeschlossen wird (polski/withdrawal/completed), iteriert der Dienst die mit der Bestellung verknüpften Abonnements über wcs_get_subscriptions_for_order und setzt den Status auf cancelled (mit einer Notiz)
  • Das Rückerstattungs-Payload ist proportional zum ungenutzten Teil des aktuellen Abrechnungszeitraums gemäß Art. 9(2)(b)(iii) der Richtlinie
  • Formel: ratio = 1 - (elapsed / total_period_length), pro Zeile auf refund_total und refund_tax angewendet
  • Es wird das minimale ratio über alle mit der Bestellung verknüpften Abonnements genommen

Drei Rückerstattungsstrategien (bundle_refund_mode in den Einstellungen oder der Filter polski_pro/withdrawal/bundle_refund_mode):

ModusVerhalten
whole_bundle (Standard)Die Rückerstattung deckt das gesamte Bundle + alle Komponenten ab (erweitert das Payload um Parent und Siblings)
proportionalRückerstattung nur für die ausgewählte Komponente (ein Anteil des Bundle-Preises proportional zur Anzahl der Positionen)
remove_discountRückerstattung für die Komponente zum Einzelpreis (ohne den Bundle-Rabatt)

Bundle-Erkennung über die Bestellpositions-Meta _bundled_by oder den Produkttyp bundle.

AnnexMultiLanguageService erweitert den Filter polski/annex/form_html um Übersetzungen für die Locales: pl, de, de_AT, fr, nl, it, es + generisches eu (englischer Fallback). Jede Übersetzung enthält den korrekten Wortlaut aus der offiziellen Fassung der Richtlinie + einen nationalen Rechtsbezug (BGB §355 DE, KSchG §11 AT, Code de la consommation art. L221-18 FR, Burgerlijk Wetboek 6:230o NL, Codice del Consumo art. 52 IT, TRLGDCU art. 102 ES, Consumer Rights Act art. 27 PL).

Sprachauswahl:

  • Die Einstellung polski_withdrawal['annex_locale'] (globale Überschreibung)
  • Automatische Erkennung aus get_locale(), wenn die Einstellung leer ist
  • Shortcode-Attribut: [polski_withdrawal_form_template_pro lang="de"]
  • Der Filter polski/annex/locale

Polski Pro › Withdrawal reports - Scorecards + Aufschlüsselung mit einem Datumsbereichsfilter:

  • Filed - Gesamtzahl der eingereichten Erklärungen
  • Completed - abgeschlossen
  • In progress - requested + confirmed
  • Rejected - abgelehnt
  • Average processing time - requested_at → completed_at (Sekunden, formatiert über human_time_diff)
  • Refunded - Anzahl × Betrag
  • Top reasons - Top 10 der einzelnen Gründe (gruppiert nach Grund)
  • Channel breakdown - online / guest / phone / email / letter / in_store

Für 5 Minuten pro Filter-Tupel zwischengespeichert (Transient).

REST-Endpunkte (Parität für ältere WP):

  • GET /polski-pro/v1/withdrawals/reports/scorecards?from=...&to=...
  • GET /polski-pro/v1/withdrawals/reports/reasons?limit=10
  • GET /polski-pro/v1/withdrawals/reports/channels

Alle abgesichert durch manage_woocommerce.

polski_pro_withdrawal_audit (Migration 2.5.0) protokolliert jedes Ereignis im Lebenszyklus der Erklärung:

FeldInhalt
withdrawal_idErklärungs-ID
order_idBestell-ID
actionrequested / confirmed / completed / rejected / guest_requested / manual_registered / refunded
actor_user_idWP-Benutzer-ID (oder NULL für einen Gast)
actor_roleDie erste WP-Rolle des Benutzers
actor_loginuser_login
ip_addressAus HTTP_CF_CONNECTING_IPX_FORWARDED_FORREMOTE_ADDR
user_agentAuf 1000 Zeichen gekürzt
payload_jsonEreignis-Snapshot (channel, reason, refund_amount, email usw.)
created_atdatetime UTC

Admin Polski Pro › Withdrawal audit - eine Tabelle mit Filtern (action, Datumsbereich, withdrawal_id, order_id) + eine Schaltfläche Export to CSV (gestreamt über admin-post.php mit einem Nonce).

REST:

  • GET /polski-pro/v1/withdrawals/audit - paginierte Liste
  • GET /polski-pro/v1/withdrawals/audit/export - gestreamtes CSV

4 zusätzliche Abilities in der Kategorie polski-pro/withdrawal:

IDFunktion
polski-pro/withdrawal-process-refundErstellt und führt die Rückerstattung für eine Erklärung aus
polski-pro/withdrawal-generate-pdfGeneriert (oder gibt ein zwischengespeichertes) Erklärungs-PDF zurück
polski-pro/withdrawal-audit-listListet Audit-Log-Einträge mit Filtern auf
polski-pro/withdrawal-report-scorecardsKPI-Dashboard

Alle abgesichert durch manage_woocommerce, beschrieben mit JSON Schema (Input/Output).

do_action('polski_pro/withdrawal/refund_processed', int $withdrawalId, WC_Order_Refund $refund);
do_action('polski/pro/withdrawal/pdf_generated', int $withdrawalId, string $filepath);
apply_filters('polski_pro/withdrawal/refund_payload', array $payload, WC_Order, int $withdrawalId);
apply_filters('polski_pro/withdrawal/download_verification_enabled', bool $enabled);
apply_filters('polski_pro/withdrawal/bundle_refund_mode', string $mode);
apply_filters('polski_pro/subscriptions/treat_as_exempt', bool $exempt, WC_Order $order);