1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//! Disclosure rules — Commission Implementing Regulation (EU) 2026/2.
//!
//! # Two scopes, and they are not the same
//!
//! ESPR **Art. 25** prohibits the *destruction* of the unsold consumer products
//! in **Annex VII** — apparel, clothing accessories and footwear, and nothing
//! else. That scope lives in [`super::annex_vii`].
//!
//! ESPR **Art. 24** imposes a *disclosure* duty on discarded unsold **consumer
//! products** generally, and Impl. Reg. (EU) 2026/2 implements it. Its own
//! Annex II — the list this module carries — runs to 45 CN headings covering
//! soap, tyres, luggage, bed linen, air conditioners, refrigerators, computers,
//! batteries, lamps, furniture, toys and sanitary articles.
//!
//! **The disclosure is therefore much wider than the destruction ban.** Treating
//! Annex VII as the scope of the disclosure would silently drop every category
//! outside apparel and footwear from a report that is required to carry them.
use Vec;
/// The CN headings of Annex II to Impl. Reg. (EU) 2026/2 — the consumer products
/// a disclosure must delimit at **four** digits rather than two.
///
/// Read from the OJ text (OJ L, 10.2.2026). Annex II's own preamble narrows it:
/// "Products listed in this Annex that are **components, intermediate products
/// or products that are not primarily intended for consumers** are not covered
/// by the obligation" — a limit on the *goods*, not on the code, and one no
/// table of headings can express. So membership here answers "which depth", not
/// "is this in scope".
const ANNEX_II_HEADINGS: & = &;
/// Whether a CN heading is listed in Annex II, and so must be disclosed at
/// four-digit depth.
/// Whether a disclosure line's CN category is filed at the depth **Art. 3**
/// requires.
///
/// Art. 3: categories are delimited on the **first two digits** of the CN code,
/// "however, the products listed in Annex II … shall be delimited based on the
/// **first four digits**".
///
/// So the test is asymmetric, and deliberately permissive in one direction:
///
/// - A 4-digit heading is always acceptable — it is required for Annex II
/// products and is strictly more precise than the two-digit default for
/// everything else.
/// - A 2-digit chapter is acceptable **unless** the chapter contains an Annex II
/// heading, in which case a product from it may have needed four digits and
/// the chapter has hidden which.
///
/// The second case cannot be decided from the code alone — a chapter holding an
/// Annex II heading also holds others — so this returns `false` and lets the
/// caller report it as a finding rather than an error.
/// Whether any Annex II heading sits inside this CN chapter.
/// Every Annex II heading inside a chapter, so a finding can say which four-digit
/// codes the disclosure may have needed.
/// The share of a line that counts as **destroyed**.
///
/// Annex I note (i): "Destruction is the sum of recycling, other recovery and
/// disposal." Preparing for reuse and unknown are outside it.
///
/// Widened to `u16` because three `u8` shares can sum past 255 in a malformed
/// record, and a wrap would report a small number for a large problem.
/// Whether a treatment split accounts for the whole line.
///
/// Note (i) has the percentages "calculated on the basis of the weight of
/// discarded unsold consumer products", and provides `unknown` for the share
/// whose treatment could not be established — so there is no share left over and
/// a well-formed split totals exactly 100.
/// Whether a set of reasons used across one product category is admissible under
/// Del. Reg. (EU) 2026/296 Art. 2, point (h).
///
/// Point (h) — offered for donation and not accepted — applies "**only where
/// none of the circumstances referred to in points (a) to (g) are applicable**".
/// It is the one derogation defined by the absence of the others, so it cannot
/// be checked on a single line: the question is whether the operator claimed it
/// for a category it also claimed a stronger reason for.
///
/// `points` are the Art. 2 point letters used for one CN category in one
/// disclosure. Returns `false` where (h) appears alongside any of (a)–(g).