Developer notes
Legal basis checked (2026-11-09)
Section titled “Legal basis checked (2026-11-09)”| 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).
Documents
Section titled “Documents”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.
PHP API
Section titled “PHP API”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 nullOther add-ons (for example an invoice builder) can read Orders::rows() to print the references on their own documents.
Licence gate
Section titled “Licence gate”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.
Full page cache
Section titled “Full page cache”No storefront output on cacheable pages. The customer order page is session-bound.
Ultimate
Section titled “Ultimate”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.
Multi-Vendor
Section titled “Multi-Vendor”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.