{"id":358192,"date":"2026-09-19T18:30:43","date_gmt":"2026-09-19T18:30:43","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/invoicepress-en16931-e-invoice-viewer\/"},"modified":"2026-09-21T17:35:18","modified_gmt":"2026-09-21T17:35:18","slug":"einvoice-viewer-for-peppol-en16931","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/einvoice-viewer-for-peppol-en16931\/","author":1721786,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.14.10","stable_tag":"2.14.10","tested":"7.1.1","requires":"5.8","requires_php":"8.2","requires_plugins":null,"header_name":"eInvoice Viewer for PEPPOL & EN16931","header_author":"Ralf Fuhrmann","header_description":"Upload and visualize electronic invoices (ZUGFeRD \/ Factur-X \/ XRechnung, CII & UBL) via a shortcode. Inspired by the ZUGFeRD Quba viewer.","assets_banners_color":"947e59","last_updated":"2026-09-21 17:35:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/invoicepress.de\/en\/solutions\/einvoice-tools\/einvoice-viewer-for-peppol-en16931\/","header_author_uri":"https:\/\/www.specialpress.de","rating":0,"author_block_rating":0,"active_installs":0,"downloads":88,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.14.10":{"tag":"2.14.10","author":"naranili","date":"2026-09-21 17:35:18","revision":3706042}},"upgrade_notice":{"2.10.1":"<p>Fixes a real data-correctness bug: the buyer&#039;s contact card could show the seller&#039;s phone\/e-mail instead of the buyer&#039;s own (or none). Also fixes a duplicated Buyer reference field and a missing Seller legal-information field. Recommended for everyone.<\/p>","2.10.0":"<p>Adds a structured-data JSON export (model_json()) and a spev_register_templates action so companion add-ons (Validator, Exporter, Visualizer) can extend the viewer without touching its code. No breaking changes.<\/p>","2.6.1":"<p>IMPORTANT: now requires PHP 8.2 (was 7.4). Code values show as &quot;code - name&quot;; more scheme codes resolve to their designation. The uploader dialog now follows the visitor&#039;s own language, not only the site&#039;s.<\/p>","2.2.0":"<p>Dates, numbers and code values now follow the site language instead of being hard-coded German, and an unknown document type code is no longer reported as an invoice. Also: consistent section headers for nested business groups, and the license of every bundled dependency documented in full.<\/p>","2.1.0":"<p>Complete EN 16931 coverage (all 164 business terms), trilingual business-term tooltips, a French interface translation, and two important fixes: uploads failed on Windows servers, and charge rows were labelled with the wrong business-group code.<\/p>","2.0.1":"<p>Business-term corrections, hardened input handling and the rename to &quot;invoicePress - e-Invoice Viewer&quot;.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3703537,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3703537,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3703537,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3703537,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.14.10"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3703537,"resolution":"1","location":"assets","locale":"","width":1060,"height":165},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3703537,"resolution":"2","location":"assets","locale":"","width":1352,"height":834},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3703537,"resolution":"3","location":"assets","locale":"","width":1354,"height":831},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3703537,"resolution":"4","location":"assets","locale":"","width":1282,"height":562}},"screenshots":{"1":"The drag &amp; drop uploader rendered by the <code>[einvoice_viewer]<\/code> shortcode.","2":"A rendered invoice with the structured Quba-inspired layout.","3":"The same invoice with the EN 16931 business-term numbers enabled.","4":"The settings page under Settings -&gt; E-Invoice Viewer."}},"plugin_section":[],"plugin_tags":[247307,226218,249779,263529,263530],"plugin_category":[],"plugin_contributors":[281609],"plugin_business_model":[],"class_list":["post-358192","plugin","type-plugin","status-publish","hentry","plugin_tags-e-invoice","plugin_tags-factur-x","plugin_tags-peppol","plugin_tags-xrechnung","plugin_tags-zugferd","plugin_contributors-naranili","plugin_committers-naranili"],"banners":{"banner":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/banner-772x250.png?rev=3703537","banner_2x":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/banner-1544x500.png?rev=3703537","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/icon-128x128.png?rev=3703537","icon_2x":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/icon-256x256.png?rev=3703537","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/screenshot-1.png?rev=3703537","caption":"The drag &amp; drop uploader rendered by the <code>[einvoice_viewer]<\/code> shortcode."},{"src":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/screenshot-2.png?rev=3703537","caption":"A rendered invoice with the structured Quba-inspired layout."},{"src":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/screenshot-3.png?rev=3703537","caption":"The same invoice with the EN 16931 business-term numbers enabled."},{"src":"https:\/\/ps.w.org\/einvoice-viewer-for-peppol-en16931\/assets\/screenshot-4.png?rev=3703537","caption":"The settings page under Settings -&gt; E-Invoice Viewer."}],"raw_content":"<!--section=description-->\n<p><strong>\u279c <a href=\"https:\/\/invoicepress.de\/en\/solutions\/einvoice-tools\/einvoice-viewer-for-peppol-en16931\/einvoice-viewer-for-peppol-en16931-demo\/\">Try the live demo<\/a><\/strong> \u2013 upload an XRechnung, ZUGFeRD\/Factur-X or Peppol BIS invoice and see it rendered instantly.<\/p>\n\n<p>eInvoice Viewer for PEPPOL &amp; EN16931 turns an uploaded electronic invoice into a clear, structured HTML view directly on your page - without any external service and without storing the file.<\/p>\n\n<p>Add the <code>[einvoice_viewer]<\/code> shortcode to a page and your visitors can drag and drop an electronic invoice into the viewer. <strong>The document is read and rendered entirely in the visitor's own browser - it is never uploaded to your server.<\/strong> The result (invoice header, parties, order and delivery data, payment details, line items, VAT breakdown and totals) appears instantly, without a page reload and without a single byte of the invoice ever crossing the network. The layout is inspired by the official ZUGFeRD Quba viewer and is rendered inside a Shadow DOM, so it looks identical in every theme.<\/p>\n\n<h4>Supported formats<\/h4>\n\n<ul>\n<li><strong>ZUGFeRD \/ Factur-X (PDF)<\/strong> - the embedded XML is extracted and read automatically.<\/li>\n<li><strong>CII (UN\/CEFACT) XML<\/strong> - read directly.<\/li>\n<li><strong>UBL \/ XRechnung (XML)<\/strong> - converted to CII internally and then read.<\/li>\n<\/ul>\n\n<h4>Highlights<\/h4>\n\n<ul>\n<li><strong>Drag &amp; drop uploader<\/strong> - vanilla JavaScript, no framework, no page reload.<\/li>\n<li><strong>Complete field coverage<\/strong> - all 164 EN 16931 business terms and all 32 business groups, verified against 125 official sample invoices. Empty fields are shown as placeholders on purpose, so you can see which terms the standard defines and which ones this invoice omitted.<\/li>\n<li><strong>Business-term labels with a short description<\/strong> - each field can carry its BT \/ BG code, and hovering it shows the term name plus a short description of the field in German, English or French. Further details (cardinality, data type, business rules) are provided by the separate \"eInvoice Viewer - Technical Details\" extension. Toggled live, per setting or via the shortcode attribute <code>bt=\"1\"<\/code> \/ <code>bt=\"0\"<\/code>.<\/li>\n<li><strong>Trilingual<\/strong> - the interface is available in English, German and French.<\/li>\n<li><strong>Theme-independent<\/strong> - rendered inside a Shadow DOM with a full style reset, so no theme styles leak through.<\/li>\n<li><strong>The document never leaves your browser<\/strong> - reading and rendering both happen client-side; your server never receives the file, so there is nothing to store, log or leak in the first place.<\/li>\n<li><strong>Secure by design<\/strong> - the invoice is parsed by the browser's own <code>DOMParser<\/code> (no server-side XML parser, so no XXE surface for the upload itself); every invoice value is escaped on output. Sibling paid extensions that genuinely need server-side processing (validation, export, \u2026) keep their own independent upload, nonce and rate-limit handling.<\/li>\n<li><strong>Extensible<\/strong> - additional layouts can be added as a template subclass, and a structured-data API returns the whole invoice as a nested array. Two filters (<code>spev_code_tooltip<\/code>, <code>spev_invoice_model<\/code>) let an add-on extend the BT\/BG tooltips and the invoice model itself.<\/li>\n<\/ul>\n\n<h4>Third-party libraries<\/h4>\n\n<p>Since reading moved into the browser, the only bundled third-party code is <strong>Mozilla pdf.js<\/strong> (<code>assets\/js\/pdfjs\/<\/code>, Apache License 2.0, license text next to the files), used to pull the embedded XML out of a ZUGFeRD \/ Factur-X PDF. Everything else in <code>vendor\/<\/code> is this plugin family's own code under GPL-2.0-or-later; <code>composer.lock<\/code> lists it.<\/p>\n\n<h3>Demo<\/h3>\n\n<p>Try the viewer without installing anything: <a href=\"https:\/\/invoicepress.de\/en\/solutions\/einvoice-tools\/einvoice-viewer-for-peppol-en16931\/einvoice-viewer-for-peppol-en16931-demo\/\">live demo on invoicePress.de<\/a>. Drop in your own e-invoice; it is read and rendered in your browser, exactly as on your own site. The plugin itself never contacts the demo site.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it through the WordPress plugins screen.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Add the shortcode <code>[einvoice_viewer]<\/code> to any page or post. To show the EN 16931 business-term numbers initially, use <code>[einvoice_viewer bt=\"1\"]<\/code>.<\/li>\n<li>Optionally adjust the options under <strong>Settings -&gt; E-Invoice Viewer<\/strong> (daily upload limit, maximum file size, proxy header, default BT visibility, layout template).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20uploaded%20invoice%20stored%20anywhere%3F\"><h3>Is the uploaded invoice stored anywhere?<\/h3><\/dt>\n<dd><p>No. The invoice is read and rendered entirely in the visitor's own browser - it is never sent to your server, so there is nothing to store, log or delete. Nothing is written to the uploads directory or the database. (Paid sibling extensions that genuinely need server-side processing, such as validation or export, do their own upload and say so.)<\/p><\/dd>\n<dt id=\"which%20invoice%20formats%20are%20supported%3F\"><h3>Which invoice formats are supported?<\/h3><\/dt>\n<dd><p>ZUGFeRD and Factur-X PDFs (the embedded XML is extracted), plus CII (UN\/CEFACT) XML and UBL \/ XRechnung XML.<\/p><\/dd>\n<dt id=\"why%20does%20the%20view%20not%20look%20pixel-perfect%20like%20the%20quba%20viewer%3F\"><h3>Why does the view not look pixel-perfect like the Quba viewer?<\/h3><\/dt>\n<dd><p>The Quba viewer transforms the invoice with the KoSIT XRechnung XSLT 3.0 via Saxon-JS. PHP only supports XSLT 1.0, so an own, Quba-inspired PHP template is used instead - functionally equivalent, but not the identical KoSIT markup.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20how%20many%20invoices%20a%20visitor%20can%20upload%3F\"><h3>Can I limit how many invoices a visitor can upload?<\/h3><\/dt>\n<dd><p>Yes. Under Settings -&gt; E-Invoice Viewer you can set a daily upload limit per visitor (logged-in users are counted by user ID, anonymous visitors by hashed IP address).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.14.10<\/h4>\n\n<ul>\n<li>Changed: the bundled business-term catalogue is now much smaller (about 1.0 MB down to 0.2 MB) because it only carries what the viewer actually shows. The tooltips are unchanged: term name and a short description in German, English or French.<\/li>\n<li>Fixed: the FAQ still said the invoice was uploaded to your server and that browser-side reading would come \"in a future version\" - it has been client-side since 2.12.0. The answer now describes what the plugin actually does.<\/li>\n<li>Changed: removed an unused internal file left over from the move to client-side rendering.<\/li>\n<\/ul>\n\n<h4>2.14.9<\/h4>\n\n<ul>\n<li>Fixed: the \"eInvoice Viewer \u2014 Technical Details\" add-on's tooltip enrichment (cardinality, data\ntype, applicable rules, XSD level, reference table, CII\/UBL path) stopped appearing when this\nplugin's own rendering moved fully client-side - its PHP filter hook no longer fires for that\ncode path. The BT\/BG tooltip now calls that add-on's own client-side module directly, the same\nway the Extended Profiles add-on's model extension was already fixed.<\/li>\n<\/ul>\n\n<h4>2.14.8<\/h4>\n\n<ul>\n<li>Fixed: when a trade party (seller, buyer, delivery location, payee) carries both a plain\nidentifier and a global identifier (e.g. an ERP customer number alongside a GLN) at the same\ntime, the plain identifier was silently dropped and its value shown mislabeled under the\nglobal-identifier's BT tag. Both are now shown independently under their own correct BT tags\n(BT-29\/-46\/-60\/-71 for the plain identifier, the matching \"-0\"\/\"-1\" tags for the global\nidentifier and its scheme).<\/li>\n<\/ul>\n\n<h4>2.14.7<\/h4>\n\n<ul>\n<li>Fixed: on some hosts, uploading a PDF failed with \"Failed to fetch dynamically imported module\" -\nthe bundled pdf.js files used the newer <code>.mjs<\/code> extension, which some servers have no correct file\ntype mapping for. Renamed to the universally-supported <code>.js<\/code> extension; no behaviour change.<\/li>\n<\/ul>\n\n<h4>2.14.6<\/h4>\n\n<ul>\n<li>Fixed: the pdf.js library the PDF-reading fix in 2.14.5 relies on was loaded from a third-party\nCDN (cdnjs.cloudflare.com) - it is now bundled with the plugin instead, same as every other\nscript and font here.<\/li>\n<\/ul>\n\n<h4>2.14.5<\/h4>\n\n<ul>\n<li>Fixed: uploading a PDF (ZUGFeRD\/Factur-X) still failed with \"The PDF does not contain a readable\ne-invoice\" even after 2.14.3's pdf.js fix - a pdf.js update changed how attached files are read,\nand this plugin's own code had not caught up. Verified this time against multiple real ZUGFeRD\/\nFactur-X sample invoices before release, not just claimed fixed.<\/li>\n<\/ul>\n\n<h4>2.14.4<\/h4>\n\n<ul>\n<li>Changed: the visitor-facing colour accent (previously teal-blue and orange, from the original\nproduct logo) is now the same navy used across the rest of the specialPress\/invoicePress tool\nfamily, so the plugin's look matches the family it belongs to.<\/li>\n<\/ul>\n\n<h4>2.14.3<\/h4>\n\n<ul>\n<li>Fixed: uploading a PDF (ZUGFeRD\/Factur-X) failed with \"PDF reading needs pdf.js, which this page\nhas not loaded.\" - the PDF-reading library is now loaded automatically, only when a PDF is\nactually uploaded.<\/li>\n<li>Fixed: for a UBL\/PEPPOL-BIS invoice, several fields (party identifier schemes, unit codes, the\npayment means name, item classification codes) always rendered empty regardless of the document's\nactual content.<\/li>\n<li>Fixed: for a UBL\/PEPPOL-BIS invoice, the delivery information section (deliver-to party, address,\ndelivery date) always rendered empty regardless of the document's actual content.<\/li>\n<\/ul>\n\n<h4>2.14.2<\/h4>\n\n<ul>\n<li>Fixed: on some sites the upload widget could render an empty box with no error - depended on the\nactive theme's own template structure, not anything a visitor did. The required script could end\nup queued before it was registered, which silently dropped the configuration data it needed.<\/li>\n<\/ul>\n\n<h4>2.14.1<\/h4>\n\n<ul>\n<li>Fixed: the plugin header was missing a \"Requires PHP\" line.<\/li>\n<\/ul>\n\n<p>Note: versions 2.12.5 through 2.14.0 are not documented here yet - this file's changelog fell behind\nthe plugin's actual version for a stretch and has not been fully backfilled.<\/p>\n\n<h4>2.12.4<\/h4>\n\n<ul>\n<li>Fixed: the paid \"Extended Profiles\" add-on's fields (Ship From, Invoicer, Invoicee, Product end user, Ultimate ship to, Buyer tax representative, document flags, cash discount \/ penalty payment terms, further references) had silently stopped appearing in the rendered invoice since 2.12.0, because the add-on's own server-side hook no longer fires now that rendering happens entirely in the browser. It now hooks into the same client-side render path directly.<\/li>\n<\/ul>\n\n<h4>2.12.3<\/h4>\n\n<ul>\n<li>The \"Export to Excel\" and \"Visualizer\" add-on buttons now also read the already-built client-side identifier model instead of re-sending the file for a second server-side parse - completes the same move for all four toolbar bridge extensions (Inbound Check and Identifier Check already made it in 2.12.1\/2.12.2).<\/li>\n<\/ul>\n\n<h4>2.12.2<\/h4>\n\n<ul>\n<li>The Identifier Check add-on now also reads the already-built client-side identifier list instead of re-sending the file for a second server-side parse - the same move already made for the Inbound Check add-on in 2.12.1. The remaining extensions (Excel export, Visualizer, Technical Details) still parse server-side for now and are unaffected either way.<\/li>\n<\/ul>\n\n<h4>2.12.1<\/h4>\n\n<ul>\n<li>The already-built client-side model is now also handed to any extension that asks for it, instead of the extension re-sending the file for a second server-side parse. The Inbound Check add-on is the first to use this (its findings are now unaffected by this plugin's own move to client-side rendering); the remaining extensions still parse server-side for now and are unaffected either way.<\/li>\n<\/ul>\n\n<h4>2.12.0<\/h4>\n\n<ul>\n<li><strong>The invoice is now read and rendered entirely in the browser - it is never uploaded to the server.<\/strong> The upload endpoint, its nonce and its daily rate limit are gone from this plugin; the shortcode's own JavaScript parses and renders the file client-side, using the same code the standalone <code>@einvoice\/core<\/code> Web Component uses. The paid companion extensions (KoSIT validator, Excel export, Visualizer, Identifier Check, Inbound Check, Technical Details) are unaffected and keep working exactly as before - they each still send the file to their own, independent endpoint when their own feature is used.<\/li>\n<li>Business-term tooltips are now fetched and rendered client-side too, in the visitor's own language (German\/English\/French, same as before).<\/li>\n<li>Known, temporary trade-off: the Technical Details add-on's tooltip extension (cardinality, data type, applicable rules) is not yet available in the client-rendered view - the BT\/BG tooltip still shows the term name and description, just without that extra detail for now.<\/li>\n<\/ul>\n\n<h4>2.10.10<\/h4>\n\n<ul>\n<li>The upload dialog now measures exactly the same width (900px) in the Viewer, the Validator and the Explainer, matching the two existing tools instead of the other way round.<\/li>\n<\/ul>\n\n<h4>2.10.9<\/h4>\n\n<ul>\n<li>Fixed: the rendered invoice was capped to the upload box's own, narrower width instead of using the full width available to the shortcode.<\/li>\n<\/ul>\n\n<h4>2.10.8<\/h4>\n\n<ul>\n<li>New \"Field Browser\" and \"Rule Browser\" buttons in the result toolbar when the companion eInvoice Viewer - Technical Details add-on is active - each opens pre-filtered to the uploaded invoice's own syntax (CII\/UBL), scope (EN16931\/EXTENDED) and rule set.<\/li>\n<\/ul>\n\n<h4>2.10.7<\/h4>\n\n<ul>\n<li>New <code>spev_register_settings<\/code> action lets a companion add-on (currently the Exporter) add its own settings block to this plugin's own Settings page.<\/li>\n<\/ul>\n\n<h4>2.10.4<\/h4>\n\n<ul>\n<li>The shared rate-limiting\/nonce\/REST plumbing is now vendored via Composer instead of a hand-copied folder - internal packaging change, no user-visible effect.<\/li>\n<\/ul>\n\n<h4>2.10.3<\/h4>\n\n<ul>\n<li>Updated the bundled horstoeko\/invoicesuite library to v0.0.31, which fixes an upstream bug where the buyer's contact card could show the seller's contact name, phone and e-mail instead of the buyer's own.<\/li>\n<\/ul>\n\n<h4>2.10.2<\/h4>\n\n<ul>\n<li>The document hero no longer shows BT badges, even with \"Show BT numbers\" on - the same fields already carry their BT code in the Invoice data card below.<\/li>\n<li>Swapped the display position of BT-5 (Currency) and BT-74 (End date) in the Invoice data card.<\/li>\n<li>In the allowances\/charges and VAT breakdown tables, each cell's BT\/BG badge now renders above its value instead of beside it.<\/li>\n<li>The \"Allowances &amp; charges\" table heading now names both business groups it covers (BG-20 and BG-21).<\/li>\n<\/ul>\n\n<h4>2.10.1<\/h4>\n\n<ul>\n<li>Fixed: the buyer's contact card silently showed the seller's contact name, phone and e-mail (BT-56\/BT-57\/BT-58) whenever a document had a seller contact but no buyer one - worked around a bug in the vendored horstoeko\/invoicesuite library.<\/li>\n<li>Fixed: BT-10 (Buyer reference) was shown twice - once correctly under Invoice data, a second time under Buyer information where it does not belong.<\/li>\n<li>Fixed: BT-33 (Seller further legal information) never displayed even when the source document carried it.<\/li>\n<\/ul>\n\n<h4>2.10.0<\/h4>\n\n<ul>\n<li>New <code>SPEV_Renderer::model_json()<\/code> - the same model as <code>model()<\/code>, as a JSON string. Purely additive; <code>model()<\/code> itself is unchanged.<\/li>\n<li>New <code>spev_register_templates<\/code> action: a companion plugin can register additional layouts from the outside without touching this plugin's code. First consumer: the new eInvoice Viewer - Visualizer add-on, four print-oriented layouts selectable in Settings -&gt; E-Invoice Viewer -&gt; Layout template.<\/li>\n<\/ul>\n\n<h4>2.9.0<\/h4>\n\n<ul>\n<li>Rate limiting and the einvoice\/v1 REST namespace unified with the companion Explainer, Validator and Exporter plugins into a shared library - existing settings carry over unchanged. New route POST \/wp-json\/einvoice\/v1\/render, alongside the existing admin-ajax.php action.<\/li>\n<li>horstoeko\/invoicesuite updated to v0.0.30.<\/li>\n<\/ul>\n\n<h4>2.8.0<\/h4>\n\n<ul>\n<li>Optional Excel export button in the result view when the companion eInvoice Viewer - Exporter add-on is active.<\/li>\n<\/ul>\n\n<h4>2.7.0<\/h4>\n\n<ul>\n<li>Optional \"Check with KoSIT\" button in the result view when the companion eInvoice Validator add-on is active - runs the official KoSIT Validator against the uploaded invoice and shows the report in the Validation Explainer's own layout, without leaving the page.<\/li>\n<\/ul>\n\n<h4>2.6.1<\/h4>\n\n<ul>\n<li>Two more coded fields resolved to their designation instead of showing a bare code: BT-21 (note subject code) and BT-128-0 (scheme of a line's object identifier).<\/li>\n<\/ul>\n\n<h4>2.6.0<\/h4>\n\n<ul>\n<li>Fixed: the uploader dialog and its status messages always showed the site's default language instead of the current visitor's own language, even though the rendered invoice already respected it correctly (a WordPress quirk: requests through admin-ajax.php resolve the locale differently from an ordinary page load).<\/li>\n<li>Code values are now shown as \"code - designation\" throughout (was \"designation (code)\").<\/li>\n<li>More coded fields resolved to their designation instead of a bare code: BT-29-1 \/ BT-46-1 (scheme of the seller\/buyer identifier), BT-30-1 \/ BT-47-1 (scheme of the registration number), BT-34-1 \/ BT-49-1 (scheme of the electronic address) and BT-157-1 (scheme of the item identifier).<\/li>\n<li>Fixed: a long CII\/UBL XPath in a business-term tooltip could overflow the tooltip box instead of wrapping onto a new line.<\/li>\n<\/ul>\n\n<h4>2.5.3<\/h4>\n\n<ul>\n<li>The reading engine now uses <code>horstoeko\/invoicesuite<\/code> instead of <code>horstoeko\/zugferd<\/code> (no visible change for existing installations).<\/li>\n<\/ul>\n\n<h4>2.5.2<\/h4>\n\n<ul>\n<li>Fixed: BT-29-1 \/ BT-46-1 (scheme of the seller\/buyer identifier) stayed empty when the source invoice carried the scheme on the plain identifier element instead of the separate global-identifier element - a real-world pattern the reading library's own convenience API does not expose on its own.<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>New <code>spev_invoice_model<\/code> filter lets an add-on append whole additional sections to the invoice model.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>New <code>spev_code_tooltip<\/code> filter lets an add-on extend a business-term tooltip with additional information (cardinality, data type, reference table, XSD level, XPath).<\/li>\n<li>Fixed: the business-term tooltip cache was shared across every rendered invoice instead of being scoped to one render, which could show one invoice's tooltip wording on another.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Typography and colour palette aligned with the companion Validation Explainer plugin (Inter \/ Space Grotesk \/ JetBrains Mono, a neutral grey scale); the brand colours themselves are unchanged.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Consistent section headers: a business group that opens its own block now always carries the same header tab, and a group nested inside another block (for example the tax representative's postal address, BG-12 inside BG-11) is marked with its own, fainter tab. The dark \/ light distinction keeps its meaning, dark for a block that carries data and light for an empty one.<\/li>\n<li>Dates and numbers now follow the site instead of being hard-coded German. Invoice dates use the format from Settings -&gt; General (new <code>spev_date_format<\/code> filter), numbers and amounts use the separators the active locale declares. On an English installation the invoice date read <code>13.11.2017<\/code> and the total <code>6.125,00 EUR<\/code> before this release. Calendar dates are formatted in their own time zone on purpose, so the day printed is always the day that stands in the XML.<\/li>\n<li>Fixed: the document type, payment means, unit of measure, VAT category and country were shown in German whatever the interface language. All five are translatable now, with the code appended in brackets, for example \"Credit note (381)\" or \"kg (KGM)\"; the section header keeps the plain name. Included in this: an unknown document type code was reported as \"invoice\", so a credit note carrying a code the plugin did not know was labelled an invoice - a false statement about a legal document. An unknown code is now shown as the code itself, and a missing one is left empty.<\/li>\n<li>Documented the license of every bundled dependency: extracting the XML from a ZUGFeRD \/ Factur-X PDF uses <code>smalot\/pdfparser<\/code> under the LGPL-3.0, everything else is MIT and the plugin's own reading engine is GPL-2.0-or-later.<\/li>\n<li>Tested against WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Complete EN 16931 coverage: all 164 business terms and all 32 business groups are now extracted and labelled (previously 119 and 9). The seller tax representative (BG-11\/BG-12) and payee (BG-10) blocks were not read at all before.<\/li>\n<li>Business-term tooltips in German, English and French, taken verbatim from the official Factur-X specification.<\/li>\n<li>French interface translation added; the German one extended to cover the new strings.<\/li>\n<li>Fixed: the allowances and charges table was labelled BG-20 throughout, which was wrong for every charge row. The business-term code is now decided per row (BG-20 vs BG-21, and BG-27 vs BG-28 on line level).<\/li>\n<li>Fixed: on Windows servers every upload failed with \"No file received.\" because the temporary upload path was passed through wp_unslash(), which strips its backslashes.<\/li>\n<li>Values that were read but discarded are now displayed: allowance and charge base amounts, percentages and reason codes, the item attribute value (BT-161) and the line identifier (BT-126).<\/li>\n<li>The reading engine was extracted into a CMS-neutral library; the plugin's own renderer shrank from about 1,100 lines to a thin bridge.<\/li>\n<li>Bundled dependencies reduced from 126 MB to 17 MB by dropping an unused PDF-writing chain the plugin never referenced.<\/li>\n<li>New: SPEV_Renderer::model() returns the structured invoice data instead of HTML.<\/li>\n<li>New: the <code>spev_label_locale<\/code> filter chooses the business-term language independently of the site language.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Business-term corrections, verified against the official EN 16931 specification (BT-115, BT-28\/BT-33, BT-56\/BT-41, BT-10, BT-47\/BT-30 and the added scheme fields BT-47-1 \/ BT-30-1).<\/li>\n<li>Updated and recompiled translations.<\/li>\n<li>Renamed the plugin to \"invoicePress - e-Invoice Viewer\".<\/li>\n<li>Switched the text domain to <code>sp-einvoice-viewer<\/code> and hardened input handling (uploads and proxy headers) for the WordPress coding standards.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New rectangular Quba-style layout with coloured section tabs and a dedicated card group per line item.<\/li>\n<li>Introduced the template engine (data model separated from HTML rendering).<\/li>\n<li>Many more fields (BT-127 to BT-160, payment cards, delivery details and more).<\/li>\n<\/ul>","raw_excerpt":"Upload and visualize e-invoices (ZUGFeRD, Factur-X, XRechnung, CII, UBL) on your site via a shortcode. No storage, theme-independent view.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=358192"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/naranili"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358192"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358192"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358192"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358192"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358192"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}