Skip to content

Developer notes

Point Source
Application date 30 December 2026; 30 June 2027 only for operators that are natural persons or micro / small undertakings established by 31 December 2024, not for products of the Annex to Regulation (EU) No 995/2010. Downstream operators and traders: 30 December 2026 whatever their size Regulation (EU) 2023/1115 Article 38 as replaced by Regulation (EU) 2025/2650
Operators communicate the reference numbers of due diligence statements, or the declaration identifiers, to downstream operators and traders Article 4(7) as amended
Downstream operators and traders collect and keep supplier and buyer contact data and, where the supplier is an operator, the reference numbers / declaration identifiers, for at least five years Article 5(3) and (4) as replaced
Simplified declaration and declaration identifier of micro or small primary operators Article 4a
Printed products (ex 49) removed from Annex I Regulation (EU) 2025/2650, Article 1(26)
Annex I changes: leather headings, rubber belts and other articles removed; tyre treads, soya beans other than for sowing, wooden seat codes; soluble coffee, frozen cattle tongues and palm-oil derivatives added from 30 December 2027 Commission Delegated Regulation (EU) 2026/2102 (OJ L, 17.9.2026)

The verification number is a term of the EUDR Information System, not of the Regulation. The add-on accepts letters, digits, spaces and - / . _ in reference and verification numbers and does not check a format.

Table Content
?:kv_eudr_products product_id, company_id, relevance (A auto, Y, N), commodity, hs_code (digits), note
?:kv_eudr_refs ref_id, product_id, company_id, kind (dds, decl, supplier = supplier record without a reference number), reference_number, verification_number, batch, supplier_name / address / email / web, received_on, is_current, note
?:kv_eudr_order_refs id, order_id, item_id, product_id, company_id (order), ref_id (0 = typed on the order or missing), kind (dds, decl, supplier), reference_number (empty = missing unless kind = supplier), verification_number, batch, supplier_name / address / email / web (copied when the order is recorded, so editing or deleting the reference never changes past orders), hs_code, commodity, source (auto, manual)
?:kv_eudr_rules category_id, commodity

All four tables are kept on uninstall unless the purge setting is on (class Retention).

Hook Use
place_order Orders::snapshot(): records the current references of relevant lines (only lines without rows; rows of removed lines are deleted, so an order edit keeps manual corrections)
get_order_info adds $order['kv_eudr'] (item_id => rows): admin area always, customer area when the output is on, the setting allows it and the buyer scope matches
delete_order deletes the order’s rows (the order and its buyer data are gone too: export the B2B CSV before deleting orders you must keep records of)
update_product_post saves product_data[kv_eudr] (settings, current flags, new reference)
delete_product_post, clone_product_post removes the product’s EUDR settings and archives its references (they stay as records) / copies relevance, commodity and HS code (not the references)

Template hooks: admin products:tabs_content (post), orders:product_info (post); storefront orders:product_info (post).

schemas/documents/order.post.php registers the variable kv_eudr (Documents\EudrVariable). The packing slip schema is built from the order schema, so the variable exists there too; for a packing slip the variable lists only the products of the context (the shipment). The snippet kv_eudr_references is installed for the snippet types order_invoice, order_summary and packing_slip_default (resources/snippet_templates.xml); Documents\TemplatePatcher adds and removes the call in the stored templates. Twig code is valid in Twig 2 and 3.

use Tygh\Addons\KvEudrReferences\Products;
use Tygh\Addons\KvEudrReferences\Refs;
use Tygh\Addons\KvEudrReferences\Orders;
use Tygh\Addons\KvEudrReferences\Annex;
Products::resolve([$product_id]); // [pid => relevant, possible, commodity, hs_code, source, from, later, ex]
Refs::currentFor([$product_id]); // [pid => [reference rows]]
Orders::rows($order_id); // [item_id => [rows]]
Annex::match('0901 21 00'); // [code, ex, commodity, label, from, exact] or null

Other add-ons (for example an invoice builder) can read Orders::rows() to print the references on their own documents.

Config::active() = setting on and License\Client::isActive(). Off: no document table, no customer order line, no new order records. Admin pages, data, editors and exports keep working.

No storefront output on cacheable pages. The customer order page is session-bound.

An administrator working in one storefront (a storefront selected, or an administrator restricted to one storefront) sees only the products owned by or shared with that storefront and only the orders of that storefront (lists, reports, B2B export, CSV import / export). “All storefronts” sees everything.

Vendor permissions list every mode (schemas/permissions/vendor_multivendor.post.php); rules and save_rules are administrator-only. Every vendor action checks the owner company of the product or order (Access::canManage() / canView()); lists and exports are filtered by the vendor’s company.