| 开发者 | itdatex |
|---|---|
| 更新时间 | 2026年7月21日 02:48 |
| PHP版本: | 8.1 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPL-2.0-or-later |
| 版权网址: | 版权信息 |
/wp-content/plugins/itdatex-e-invoice-intake/, or install via the Plugins screen.*_reing_invoices, *_reing_files, *_reing_audit_log) and a protected upload directory under wp-content/uploads/itdatex-e-invoice-intake-{random}/. On uninstall, invoice data and files are NOT deleted by default because of statutory retention requirements (8 to 10 years under German tax and commercial law).
To force a full cleanup on uninstall, add this line to your wp-config.php before deleting the plugin:
define( 'REING_UNINSTALL_DELETE_ALL', true );The free version makes no external HTTP calls. All parsing, validation and storage happens locally in your WordPress installation. You can verify this by inspecting the source — the only network code path is the optional Pro upgrade, which is not part of this plugin.
XRechnung in both UBL and UN/CEFACT (CII) syntax, ZUGFeRD from version 2.0.1 onwards (PDF/A-3 with embedded XML), and Factur-X. Pure PDFs without an embedded XML payload are recognized as "legacy PDF" and stored as files, but their fields can only be extracted with the optional Pro AI extraction.
The plugin provides the technical foundation — immutable storage, hash chain, audit log — that a GoBD-conformant process requires. Whether your concrete bookkeeping process is GoBD-conformant is a question for your tax advisor and depends on more than just the software you use. We deliberately do NOT advertise "GoBD certification" because no such certification mechanism exists in Germany.
You can mark invoices as paid or disputed. Physically deleting invoices in WordPress is intentionally not exposed in the UI to protect the integrity of the hash chain. If you have a legal reason to delete (e.g. erroneous double-upload), please use direct database access and document the deletion in your retention log.
The plugin uses the WordPress / PHP upload size limit (upload_max_filesize, post_max_size). XRechnung files are typically well below 1 MB; ZUGFeRD PDFs can reach a few MB. If you need higher limits, increase them in your php.ini or .htaccess.
Yes. The protected upload directory uses both .htaccess (Apache/LiteSpeed) and a randomized directory name so that path guessing fails. File downloads always go through a capability-and-nonce-checked endpoint, never via a direct URL — so the front-end web server's authorization model is irrelevant for the file path security.
These are paid features in the Pro version. The free version focuses on the core legal requirement — receiving and archiving incoming e-invoices — and keeps the dependency surface small to make security review easy.
phpcs:ignore around the duplicate-check query in IngestService::ingest() with a phpcs:disable/phpcs:enable block so the sniff annotation also covers the interpolated SQL literal on the following line. No behaviour change.reing_ prefix in uninstall.php and the bootstrap file so the sniff no longer flags them; wrap the three admin view files (page-inbox.php, page-invoice.php, page-upload.php) with a phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound block explaining that the vars are template-locals, not globals. Annotated the read-only $_GET accesses in Admin\Pages\Invoice and Admin\Pages\Inbox with phpcs:ignore WordPress.Security.NonceVerification.Recommended (display-only, all writes go through nonce-protected admin-post endpoints). Annotated the duplicate-check $wpdb->get_var() in IngestService (table-name accessor, no user input). Gated the error_log() call in the same file behind WP_DEBUG. Annotated $_FILES['invoice_file'] in UploadHandler (cannot be sanitized like a string; validated by Parser + Validator downstream). Rewrote the uninstall DROP TABLE loop with a phpcs:ignore + rationale for uninstall-time schema removal.*.xslt, *.sch, *.xmp) from the bundled horstoeko/zugferd library nor the Sphinx docs from jms/serializer — they are not used at runtime by the free plugin (validation runs against KoSIT in the optional Pro backend). Removed the unused, outdated transitive setasign/fpdf 1.9 dependency entirely. Annotated the two remaining static SQL statements in InvoiceRepository::lastChainHash() and countInvoices() with rationale.FormatDetector, Parser, Storage, InvoiceRepository), replace is_writable() with wp_is_writable(), unlink() with wp_delete_file(), rmdir() with WP_Filesystem::rmdir(), drop best-effort chmod() on stored invoices, inline SQL in listOpenInvoices() to satisfy the prepared-SQL sniff, annotate the dynamic listForExport query and the streaming readfile() in the download endpoint. No behaviour change.InvoiceRepository::listOpenInvoices() and summarizeOpenInvoices() for due-date reporting and aggregation by bucket (overdue / this week / this month / later / no date). Used by the optional Pro dashboard.InvoiceRepository::listForExport($from, $to, $status, $limit) with safe date range and status filter for CSV/DATEV exporters. Used by the optional Pro export module.IngestService::ingest($path, $name, $source, $actor) encapsulating the parse → validate → store → audit pipeline. UploadHandler refactored to use it. Enables add-ons (e.g. Pro IMAP import) to reuse the exact same processing chain that the browser upload uses, including the existing hooks.reing_applyable_fields and action reing_apply_invoice_fields($id, $fields, $source) to allow add-ons to update invoice fields with type-safe sanitisation. Adds InvoiceRepository::applyableFields() and updateFields() with date / amount / currency normalisation. Sets extracted_by = 'ai_draft' and writes a structured audit entry.reing_after_validate($tmpPath, $report, $invoiceData), reing_after_invoice_insert($id, $invoiceData, $report) and reing_invoice_view_after_validation($invoice, $reportData) allow optional Pro extensions to plug in deep validation, AI explanations and extra UI cards without modifying the free core. Includes a small backup autoloader for the prefixed Smalot/PdfParser library that the Strauss-generated PSR-0 mapping does not resolve correctly.