# Additional codes ## What additional codes are Goods are usually identified by their 10-digit [commodity code](https://uktrade.github.io/tariff-data-manual/documentation/tariff-data-structures/nomenclature.html#commodity-codes). Sometimes additional context is needed, beyond just the type of good identified by the commodity code, to ensure that the apporpriate tariffs and/or restrictions are applied, in these cases additional codes are used. Additional codes identify: * whether a company is subject to punitive measures, such as anti-dumping duties * products which have reduced duties because they are for pharmaceutical use * the route goods take into the UK and how different tariff or regulatory treatments apply * stolen works of art, for example from Syria or Iraq as a result of military conflict Additional codes can be applied to more than one commodity code. ## How additional codes work Additional codes are 4 digits combining the following 2 elements: * a code type * a 3-character ID (which can also include letters) The additional code type defines the additional code that is being addressed. For example, the additional code C233 is made up of type C and specific ID 233. Numeric IDs from 001 to 999 can be reused across multiple additional code type IDs. Numeric IDs are unique only when they are used with a character code. The list of addional codes is frequently updated, with tens of new codes being added each year. ## Additional Code Types ```sql SELECT additional_code_types.sid AS "Code Type", additional_code_types.description AS "Description", CASE WHEN application_code = 0 THEN "Export refund nomenclature" WHEN application_code = 1 THEN "Additional codes" WHEN application_code = 3 THEN "Meursing additional codes" WHEN application_code = 4 THEN "Export refund for processed agricultural goods" END AS "Applicability" FROM additional_code_types INNER JOIN common_version_groups ON additional_code_types.trackedmodel_ptr_id = common_version_groups.current_version_id ``` The list of additional code types is set by DBT, and rarely changes as it requires extensive updates to downstream systems. The only changes in the last two decades have been the addition of code type C in 2009, and the end of code type F in 2016. Applicability indicates the data type the additional codes apply to. Only those labelled "Additional Codes" are still in use, however the remainder still appear in the data and are included here for completeness. ### Entity-relationship diagram for additional codes ```dbml Table "Additional Codes" { "Code Id" char(3) [pk] "Code Type Id" varchar(4) [pk] "Validity Start" date [not null] "Validity End" date } Table "Additional Code Descriptions" { "Description Id" int [pk] "Described Code Id" char(3) [pk] "Description" varchar(255) "Validity Start" date [not null] } Table "Additional Code Types" { "Code Type Id" char(1) [pk] "Code Type Description" varchar(255) "Application Code" char(1) [not null] "Validity Start" date [not null] "Validity End" date } Table "Footnote Additional Code Associations" { "Footnote Type" char(2) [pk] "Footnote Code" char(3) [pk] "Additional Code Id" int [pk] "Validity Start" date [not null] "Validity End" date } Table "Measures" { "Measure Id" [pk] "Additional Code Id" [pk] "..." "..." } Table "Measure Additional Code Types" { "Additional Code Type Id" [pk] "Measure Type Id" [pk] "Validity Start" date [not null] "Validity End" date } Table "Measure Types" { "Measure Type Id" [pk] "..." "..." } Ref: "Additional Codes"."Code Type Id" > "Additional Code Types"."Code Type Id" Ref: "Additional Code Descriptions"."Described Code Id" > "Additional Codes"."Code Id" Ref: "Footnote Additional Code Associations"."Additional Code Id" > "Additional Codes"."Code Id" Ref: "Measures"."Additional Code Id" > "Additional Codes"."Code Id" Ref: "Additional Code Types"."Code Type Id" > "Measure Additional Code Types"."Additional Code Type Id" Ref: "Measure Additional Code Types"."Measure Type Id" > "Measure Types"."Measure Type Id" ``` ## Validation rules ### Additional Codes | Code | Description | |---|---| | ACN1 | [Uniqueness](Validity-rules;-Uniqueness.md) for combination of fields additional code type, additional code ID and start date. | | ACN13 | [Validity contained](Validity-rules;-Validity-contained.md) rule requiring that when an additional code is referred to in a [measure](Data-structures;-Measure.md), the validity period of the code must span the validity period of the measure. | | ACN14 | [Deletion while in use](Validity-rules;-Deletion-while-in-use.md) for additional codes that are used in a [measure](Data-structures;-Measure.md). | | ACN17 | [Validity contained](Validity-rules;-Validity-contained.md) rule for the additional code type the additional code belongs to. | | ACN2 | The referenced additional code type must exist and have as application code “non-Meursing” or “Export Refund for Processed Agricultural Goods. | | ACN4 | [Validity overlaps with self](Validity-rules;-Validity-overlaps-with-self.md) rule stating the validity period of the additional code must not overlap any other additional code with the same additional code type, additional code ID and start date. | | ACN5 | [Mandatory subrecord](Validation-rules;-Mandatory-subrecord.md) rule for additional code descriptions. The start date of the first description period must be equal to the start date of the additional code. No two associated description periods may have the same start date. The start date must be less than or equal to the end date of the additional code. | | CT1 | [Uniqueness](Validity-rules;-Uniqueness.md) rule for additional code types. | Read the validation rules for additional codes in the [system documentation](https://uktrade.github.io/tamato/html/business_rules/additional_codes.html). ## How additional codes apply Additional codes can only be applied to particular types of measures. For example, types 8, A, B and C can only be used with trade remedies. The full lists of measure types that can reference additional code types are shown below for each code type. ### Prohibition/Restriction/Surveillance (3) ```sql SELECT measure_types.sid AS "Measure Type", measure_types.description AS "Description" FROM measure_additional_code_types INNER JOIN common_version_groups AS cvg0 ON measure_additional_code_types.trackedmodel_ptr_id = cvg0.current_version_id INNER JOIN common_tracked_models AS ctm1 ON measure_additional_code_types.measure_type_id = ctm1.id INNER JOIN common_version_groups AS cvg1 ON ctm1.version_group_id = cvg1.id INNER JOIN measure_types ON cvg1.current_version_id = measure_types .trackedmodel_ptr_id INNER JOIN common_tracked_models AS ctm2 ON measure_additional_code_types.additional_code_type_id = ctm2.id INNER JOIN common_version_groups AS cvg2 ON ctm2.version_group_id = cvg2.id INNER JOIN additional_code_types ON cvg2.current_version_id = additional_code_types.trackedmodel_ptr_id WHERE additional_code_types.sid = "3" GROUP BY measure_types.sid ``` ### Dual Use (D) ```sql SELECT measure_types.sid AS "Measure Type", measure_types.description AS "Description" FROM measure_additional_code_types INNER JOIN common_version_groups AS cvg0 ON measure_additional_code_types.trackedmodel_ptr_id = cvg0.current_version_id INNER JOIN common_tracked_models AS ctm1 ON measure_additional_code_types.measure_type_id = ctm1.id INNER JOIN common_version_groups AS cvg1 ON ctm1.version_group_id = cvg1.id INNER JOIN measure_types ON cvg1.current_version_id = measure_types .trackedmodel_ptr_id INNER JOIN common_tracked_models AS ctm2 ON measure_additional_code_types.additional_code_type_id = ctm2.id INNER JOIN common_version_groups AS cvg2 ON ctm2.version_group_id = cvg2.id INNER JOIN additional_code_types ON cvg2.current_version_id = additional_code_types.trackedmodel_ptr_id WHERE additional_code_types.sid = "D" GROUP BY measure_types.sid ``` ### Agricultural Tables (non-Meursing) (6) ```sql SELECT measure_types.sid AS "Measure Type", measure_types.description AS "Description" FROM measure_additional_code_types INNER JOIN common_version_groups AS cvg0 ON measure_additional_code_types.trackedmodel_ptr_id = cvg0.current_version_id INNER JOIN common_tracked_models AS ctm1 ON measure_additional_code_types.measure_type_id = ctm1.id INNER JOIN common_version_groups AS cvg1 ON ctm1.version_group_id = cvg1.id INNER JOIN measure_types ON cvg1.current_version_id = measure_types .trackedmodel_ptr_id INNER JOIN common_tracked_models AS ctm2 ON measure_additional_code_types.additional_code_type_id = ctm2.id INNER JOIN common_version_groups AS cvg2 ON ctm2.version_group_id = cvg2.id INNER JOIN additional_code_types ON cvg2.current_version_id = additional_code_types.trackedmodel_ptr_id WHERE additional_code_types.sid = "6" GROUP BY measure_types.sid ``` ### Tariff Preference (2) ```sql SELECT measure_types.sid AS "Measure Type", measure_types.description AS "Description" FROM measure_additional_code_types INNER JOIN common_version_groups AS cvg0 ON measure_additional_code_types.trackedmodel_ptr_id = cvg0.current_version_id INNER JOIN common_tracked_models AS ctm1 ON measure_additional_code_types.measure_type_id = ctm1.id INNER JOIN common_version_groups AS cvg1 ON ctm1.version_group_id = cvg1.id INNER JOIN measure_types ON cvg1.current_version_id = measure_types .trackedmodel_ptr_id INNER JOIN common_tracked_models AS ctm2 ON measure_additional_code_types.additional_code_type_id = ctm2.id INNER JOIN common_version_groups AS cvg2 ON ctm2.version_group_id = cvg2.id INNER JOIN additional_code_types ON cvg2.current_version_id = additional_code_types.trackedmodel_ptr_id WHERE additional_code_types.sid = "2" GROUP BY measure_types.sid ``` ### Restrictions (4) ```sql SELECT measure_types.sid AS "Measure Type", measure_types.description AS "Description" FROM measure_additional_code_types INNER JOIN common_version_groups AS cvg0 ON measure_additional_code_types.trackedmodel_ptr_id = cvg0.current_version_id INNER JOIN common_tracked_models AS ctm1 ON measure_additional_code_types.measure_type_id = ctm1.id INNER JOIN common_version_groups AS cvg1 ON ctm1.version_group_id = cvg1.id INNER JOIN measure_types ON cvg1.current_version_id = measure_types .trackedmodel_ptr_id INNER JOIN common_tracked_models AS ctm2 ON measure_additional_code_types.additional_code_type_id = ctm2.id INNER JOIN common_version_groups AS cvg2 ON ctm2.version_group_id = cvg2.id INNER JOIN additional_code_types ON cvg2.current_version_id = additional_code_types.trackedmodel_ptr_id WHERE additional_code_types.sid = "4" GROUP BY measure_types.sid ``` ### Anti-dumping/countervailing measures (8,A,B,C) ```sql SELECT measure_types.sid AS "Measure Type", measure_types.description AS "Description" FROM measure_additional_code_types INNER JOIN common_version_groups AS cvg0 ON measure_additional_code_types.trackedmodel_ptr_id = cvg0.current_version_id INNER JOIN common_tracked_models AS ctm1 ON measure_additional_code_types.measure_type_id = ctm1.id INNER JOIN common_version_groups AS cvg1 ON ctm1.version_group_id = cvg1.id INNER JOIN measure_types ON cvg1.current_version_id = measure_types .trackedmodel_ptr_id INNER JOIN common_tracked_models AS ctm2 ON measure_additional_code_types.additional_code_type_id = ctm2.id INNER JOIN common_version_groups AS cvg2 ON ctm2.version_group_id = cvg2.id INNER JOIN additional_code_types ON cvg2.current_version_id = additional_code_types.trackedmodel_ptr_id WHERE additional_code_types.sid = "8" OR additional_code_types.sid = "A" OR additional_code_types.sid = "B" OR additional_code_types.sid = "C" GROUP BY measure_types.sid ```