diff --git a/intrastat_base/models/__init__.py b/intrastat_base/models/__init__.py index 68e295542..fa8038d08 100644 --- a/intrastat_base/models/__init__.py +++ b/intrastat_base/models/__init__.py @@ -4,3 +4,4 @@ from . import res_company from . import res_config_settings from . import intrastat_common +from . import res_partner diff --git a/intrastat_base/models/res_partner.py b/intrastat_base/models/res_partner.py new file mode 100644 index 000000000..ed692b8ce --- /dev/null +++ b/intrastat_base/models/res_partner.py @@ -0,0 +1,67 @@ +# Copyright 2022 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, models +from odoo.exceptions import UserError + +XI_COUNTY_NAMES = [ + "antrim", + "armagh", + "down", + "fermanagh", + "londonderry", + "tyrone", + "northern ireland", +] + +XI_COUNTIES = [ + "base.state_uk18", # County Antrim + "base.state_uk19", # County Armagh + "base.state_uk20", # County Down + "base.state_uk22", # County Fermanagh + "base.state_uk23", # County Londonderry + "base.state_uk24", # County Tyrone + "base.state_ie_27", # Antrim + "base.state_ie_28", # Armagh + "base.state_ie_29", # Down + "base.state_ie_30", # Fermanagh + "base.state_ie_31", # Londonderry + "base.state_ie_32", # Tyrone +] + + +class ResPartner(models.Model): + _inherit = "res.partner" + + @api.model + def _get_xi_counties(self): + return [self.env.ref(x) for x in XI_COUNTIES] + + @api.model + def _get_xu_counties(self): + uk_counties = self.env.ref("base.uk").state_ids + xu_counties = uk_counties.filtered(lambda r: r not in self._get_xi_counties()) + return xu_counties + + def _get_intrastat_country_code(self, country=None, state=None): + if self: + self.ensure_one() + country = self.country_id + state = self.state_id + else: + state = state or self.env["res.country.state"] + country = country or state.country_id + if not country: + raise UserError( + _("Programming Error when calling '_get_intrastat_country_code()") + ) + cc = country.code + if cc == "GB": + cc = "XU" + if state and cc in ["XU", "IE"]: + if ( + state in self._get_xi_counties() + or state.name.lower().strip() in XI_COUNTY_NAMES + ): + cc = "XI" + return cc diff --git a/intrastat_base/tests/common.py b/intrastat_base/tests/common.py new file mode 100644 index 000000000..493eed772 --- /dev/null +++ b/intrastat_base/tests/common.py @@ -0,0 +1,16 @@ +# Copyright 2022 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +class IntrastatCommon(object): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.chart_template_obj = cls.env["account.chart.template"] + cls.mail_obj = cls.env["mail.mail"] + + cls.demo_user = cls.env.ref("base.user_demo") + cls.demo_company = cls.env.ref("base.main_company") + + cls.shipping_cost = cls.env.ref("intrastat_base.shipping_costs_exclude") diff --git a/intrastat_product/README.rst b/intrastat_product/README.rst index 494c08c53..d6827c313 100644 --- a/intrastat_product/README.rst +++ b/intrastat_product/README.rst @@ -135,6 +135,11 @@ Contributors * Alexis de Lattre, Akretion * Luc De Meyer, Noviat + +* `Tecnativa `_: + + * Víctor Martínez + Maintainers ~~~~~~~~~~~ diff --git a/intrastat_product/models/account_move.py b/intrastat_product/models/account_move.py index 2491db621..60e123f84 100644 --- a/intrastat_product/models/account_move.py +++ b/intrastat_product/models/account_move.py @@ -1,5 +1,5 @@ -# Copyright 2011-2017 Akretion France (http://www.akretion.com) -# Copyright 2009-2020 Noviat (http://www.noviat.com) +# Copyright 2011-2020 Akretion France (http://www.akretion.com) +# Copyright 2009-2022 Noviat (http://www.noviat.com) # @author Alexis de Lattre # @author Luc de Meyer @@ -84,12 +84,24 @@ def compute_intrastat_lines(self): def _get_intrastat_line_vals(self, line): vals = {} + notedict = { + "note": "", + "line_nbr": 0, + } decl_model = self.env["intrastat.product.declaration"] if decl_model._is_product(line): hs_code = line.product_id.get_hs_code_recursively() if not hs_code: return vals - weight, qty = decl_model._get_weight_and_supplunits(line, hs_code) + weight, qty = decl_model._get_weight_and_supplunits(line, hs_code, notedict) + product_country = line.product_id.origin_country_id + product_state = line.product_id.origin_state_id + country = product_country or product_state.country_id + product_origin_country_code = "QU" + if country: + product_origin_country_code = self.env[ + "res.partner" + ]._get_intrastat_country_code(product_country, product_state) vals.update( { "invoice_line_id": line.id, @@ -97,6 +109,7 @@ def _get_intrastat_line_vals(self, line): "transaction_weight": int(weight), "transaction_suppl_unit_qty": qty, "product_origin_country_id": line.product_id.origin_country_id.id, + "product_origin_country_code": product_origin_country_code, } ) return vals @@ -158,11 +171,23 @@ class AccountMoveIntrastatLine(models.Model): transaction_weight = fields.Integer( help="Transaction weight in Kg: Quantity x Product Weight" ) + # product_origin_country_id is replaced by product_origin_country_code + # this field should be dropped once the localisation modules have been + # adapted accordingly product_origin_country_id = fields.Many2one( comodel_name="res.country", string="Country of Origin", help="Country of origin of the product i.e. product " "'made in ____'.", ) + product_origin_country_code = fields.Char( + string="Country of Origin of the Product", + size=2, + required=True, + default="QU", + help="2 digit code of country of origin of the product except for the UK.\n" + "Specify 'XI' for UK Northern Ireland and 'XU' for rest of the UK.\n" + "Specify 'QU' when the country is unknown.\n", + ) @api.onchange("invoice_line_id") def _onchange_move_id(self): @@ -174,3 +199,18 @@ def _onchange_move_id(self): ("id", "not in", moves.mapped("intrastat_line_ids.invoice_line_id").ids), ] return {"domain": {"invoice_line_id": dom}} + + @api.model + def create(self, vals): + self._format_vals(vals) + return super().create(vals) + + def write(self, vals): + self._format_vals(vals) + return super().write(vals) + + def _format_vals(self, vals): + if "product_origin_country_code" in vals: + vals["product_origin_country_code"] = ( + vals["product_origin_country_code"].upper().strip() + ) diff --git a/intrastat_product/models/intrastat_product_declaration.py b/intrastat_product/models/intrastat_product_declaration.py index 74f992201..6518aa298 100644 --- a/intrastat_product/models/intrastat_product_declaration.py +++ b/intrastat_product/models/intrastat_product_declaration.py @@ -1,10 +1,12 @@ -# Copyright 2011-2017 Akretion France (http://www.akretion.com) -# Copyright 2009-2020 Noviat (http://www.noviat.com) +# Copyright 2011-2020 Akretion France (http://www.akretion.com) +# Copyright 2009-2022 Noviat (http://www.noviat.com) # @author Alexis de Lattre +# Copyright 2022 Tecnativa - Víctor Martínez # @author Luc de Meyer import logging -from datetime import date, datetime +import warnings +from datetime import date from dateutil.relativedelta import relativedelta @@ -239,15 +241,71 @@ def _account_config_warning(self, msg): msg, action.id, _("Go to Accounting Configuration Settings screen") ) - def _get_partner_country(self, inv_line): - country = ( - inv_line.move_id.src_dest_country_id - or inv_line.move_id.partner_id.country_id - ) - if not country.intrastat: - country = False - elif country == self.company_id.country_id: - country = False + def _get_partner_country(self, inv_line, notedict, eu_countries): + inv = inv_line.move_id + country = inv.src_dest_country_id or inv.partner_id.country_id + if not country: + line_notes = [ + _( + "Missing country on invoice partner '%s' " + "or on the delivery address (partner '%s'). " + ) + % ( + inv.partner_id.display_name, + inv.partner_shipping_id + and inv.partner_shipping_id.display_name + or "-", + ) + ] + self._format_line_note(inv_line, notedict, line_notes) + else: + if country not in eu_countries and country.code != "GB": + line_notes = [ + _( + "On invoice '%s', the source/destination country " + "is '%s' which is not part of the European Union." + ) + % (inv.name, country.name) + ] + self._format_line_note(inv_line, notedict, line_notes) + if country and country.code == "GB" and self.year >= "2021": + vat = inv.commercial_partner_id.vat + if not vat: + line_notes = [ + _( + "On invoice '%s', the source/destination country " + "is United-Kingdom and the fiscal position is '%s'. " + "Make sure that the fiscal position is right. If " + "the origin/destination is Northern Ireland, please " + "set the VAT number of the partner '%s' in Odoo with " + "its new VAT number starting with 'XI' following Brexit." + ) + % ( + inv.name, + inv.fiscal_position_id.display_name, + inv.commercial_partner_id.display_name, + ) + ] + self._format_line_note(inv_line, notedict, line_notes) + elif not vat.startswith("XI"): + line_notes = [ + _( + "On invoice '%s', the source/destination country " + "is United-Kingdom, the fiscal position is '%s' and " + "the partner's VAT number is '%s'. " + "Make sure that the fiscal position is right. If " + "the origin/destination is Northern Ireland, please " + "update the VAT number of the partner '%s' in Odoo with " + "its new VAT number starting with 'XI' following Brexit." + ) + % ( + inv.name, + inv.fiscal_position_id.display_name, + vat, + inv.commercial_partner_id.display_name, + ) + ] + self._format_line_note(inv_line, notedict, line_notes) return country def _get_intrastat_transaction(self, inv_line): @@ -265,8 +323,7 @@ def _get_intrastat_transaction(self, inv_line): elif invoice.type == "in_refund": return company.intrastat_transaction_in_refund - def _get_weight_and_supplunits(self, inv_line, hs_code): - line_nbr = self._line_nbr + def _get_weight_and_supplunits(self, inv_line, hs_code, notedict): line_qty = inv_line.quantity product = inv_line.product_id intrastat_unit_id = hs_code.intrastat_unit_id @@ -279,7 +336,7 @@ def _get_weight_and_supplunits(self, inv_line, hs_code): if not source_uom: line_notes = [_("Missing unit of measure.")] - self._note += self._format_line_note(inv_line, line_nbr, line_notes) + self._note += self._format_line_note(inv_line, notedict, line_notes) return weight, suppl_unit_qty if intrastat_unit_id: @@ -293,7 +350,7 @@ def _get_weight_and_supplunits(self, inv_line, hs_code): ) % intrastat_unit_id.name, ] - self._note += self._format_line_note(inv_line, line_nbr, line_notes) + self._note += self._format_line_note(inv_line, notedict, line_notes) return weight, suppl_unit_qty if target_uom.category_id == source_uom.category_id: suppl_unit_qty = source_uom._compute_quantity(line_qty, target_uom) @@ -305,7 +362,7 @@ def _get_weight_and_supplunits(self, inv_line, hs_code): ) % (source_uom.name, target_uom.name) ] - self._note += self._format_line_note(inv_line, line_nbr, line_notes) + self._note += self._format_line_note(inv_line, notedict, line_notes) return weight, suppl_unit_qty if weight: @@ -320,7 +377,7 @@ def _get_weight_and_supplunits(self, inv_line, hs_code): line_notes = [ _("Missing weight on product %s.") % product.name_get()[0][1] ] - self._note += self._format_line_note(inv_line, line_nbr, line_notes) + self._note += self._format_line_note(inv_line, notedict, line_notes) return weight, suppl_unit_qty if source_uom == pce_uom: weight = product.weight * line_qty # product.weight_net @@ -339,7 +396,7 @@ def _get_weight_and_supplunits(self, inv_line, hs_code): ) % (source_uom.name, product.name_get()[0][1]) ] - self._note += self._format_line_note(inv_line, line_nbr, line_notes) + self._note += self._format_line_note(inv_line, notedict, line_notes) return weight, suppl_unit_qty return weight, suppl_unit_qty @@ -412,8 +469,29 @@ def _get_incoterm(self, inv_line): return incoterm def _get_product_origin_country(self, inv_line): + warnings.warn( + "Method '_get_product_origin_country' is deprecated, " + "please use '_get_product_origin_country_code'.", + DeprecationWarning, + ) return inv_line.product_id.origin_country_id + def _get_product_origin_country_code(self, inv_line, product_origin_country): + cc = "QU" + if product_origin_country.code: + cc = product_origin_country.code + year = self.year or str(inv_line.move_id.date.year) + if year >= "2021": + product_origin_state = getattr( + inv_line.product_id, + "origin_state_id", + self.env["res.country.state"], + ) + cc = self.env["res.partner"]._get_intrastat_country_code( + product_origin_country, product_origin_state + ) + return cc + def _update_computation_line_vals(self, inv_line, line_vals): """ placeholder for localization modules """ @@ -486,24 +564,25 @@ def _is_product(self, invoice_line): else: return False - def _gather_invoices_init(self): + def _gather_invoices_init(self, notedict): """ placeholder for localization modules """ - def _format_line_note(self, line, line_nbr, line_notes): + def _format_line_note(self, line, notedict, line_notes): indent = 8 * " " - note = _("Invoice %s, line %s") % (line.move_id.name, line_nbr) + note = _("Invoice %s, line %s") % (line.move_id.name, notedict["line_nbr"]) note += ":\n" for line_note in line_notes: note += indent + line_note note += "\n" - return note + notedict["note"] += note - def _gather_invoices(self): + def _gather_invoices(self, notedict): lines = [] accessory_costs = self.company_id.intrastat_accessory_costs + eu_countries = self.env.ref("base.europe").country_ids - self._gather_invoices_init() + self._gather_invoices_init(notedict) domain = self._prepare_invoice_domain() order = "journal_id, name" invoices = self.env["account.move"].search(domain, order=order) @@ -543,25 +622,12 @@ def _gather_invoices(self): ) continue - partner_country = self._get_partner_country(inv_line) - if not partner_country: - _logger.info( - "Skipping invoice line %s qty %s " - "of invoice %s. Reason: no partner_country" - % (inv_line.name, inv_line.quantity, invoice.name) - ) - continue - - if any( - [tax.exclude_from_intrastat_if_present for tax in inv_line.tax_ids] - ): - _logger.info( - "Skipping invoice line %s " - "qty %s of invoice %s. Reason: " - "tax.exclude_from_intrastat_if_present" - % (inv_line.name, inv_line.quantity, invoice.name) - ) - continue + partner_country = self._get_partner_country( + inv_line, notedict, eu_countries + ) + partner_country_code = ( + invoice.commercial_partner_id._get_intrastat_country_code() + ) if inv_intrastat_line: hs_code = inv_intrastat_line.hs_code_id @@ -573,7 +639,7 @@ def _gather_invoices(self): % (inv_line.product_id.name_get()[0][1]) ] self._note += self._format_line_note( - inv_line, line_nbr, line_notes + inv_line, notedict, line_notes ) continue else: @@ -591,7 +657,7 @@ def _gather_invoices(self): suppl_unit_qty = inv_intrastat_line.transaction_suppl_unit_qty else: weight, suppl_unit_qty = self._get_weight_and_supplunits( - inv_line, hs_code + inv_line, hs_code, notedict ) total_inv_weight += weight @@ -604,8 +670,14 @@ def _gather_invoices(self): product_origin_country = ( inv_intrastat_line.product_origin_country_id ) + product_origin_country_code = ( + inv_intrastat_line.product_origin_country_code + ) else: - product_origin_country = self._get_product_origin_country(inv_line) + product_origin_country = inv_line.product_id.origin_country_id + product_origin_country_code = self._get_product_origin_country_code( + inv_line, product_origin_country + ) region = self._get_region(inv_line) @@ -613,6 +685,7 @@ def _gather_invoices(self): "parent_id": self.id, "invoice_line_id": inv_line.id, "src_dest_country_id": partner_country.id, + "src_dest_country_code": partner_country_code, "product_id": inv_line.product_id.id, "hs_code_id": hs_code.id, "weight": weight, @@ -621,6 +694,7 @@ def _gather_invoices(self): "amount_accessory_cost_company_currency": 0.0, "transaction_id": intrastat_transaction.id, "product_origin_country_id": product_origin_country.id or False, + "product_origin_country_code": product_origin_country_code, "region_id": region and region.id or False, } @@ -684,32 +758,27 @@ def action_gather(self): self._extended = True else: self._extended = False - + notedict = { + "note": "", + "line_nbr": 0, + } self.computation_line_ids.unlink() self.declaration_line_ids.unlink() - lines = self._gather_invoices() - + lines = self._gather_invoices(notedict) + vals = {"note": notedict["note"]} if not lines: - self.action = "nihil" - note = ( + vals["action"] = "nihil" + vals["note"] += ( "\n" + _("No records found for the selected period !") + "\n" + _("The Declaration Action has been set to 'nihil'.") ) - self._note += note else: - self.write({"computation_line_ids": [(0, 0, x) for x in lines]}) + vals["computation_line_ids"] = [(0, 0, x) for x in lines] - if self._note: - note_header = ( - "\n\n>>> " - + fields.Datetime.to_string( - fields.Datetime.context_timestamp(self, datetime.now()) - ) - + "\n" - ) - self.note = note_header + self._note + (self.note or "") + self.write(vals) + if vals["note"]: result_view = self.env.ref("intrastat_base.intrastat_result_view_form") return { "name": _("Generate lines from invoices: results"), @@ -718,7 +787,7 @@ def action_gather(self): "res_model": "intrastat.result.view", "view_id": result_view.id, "target": "new", - "context": dict(self._context, note=self._note), + "context": dict(self._context, note=vals["note"]), "type": "ir.actions.act_window", } @@ -727,14 +796,13 @@ def action_gather(self): @api.model def _group_line_hashcode_fields(self, computation_line): return { - "country": computation_line.src_dest_country_id.id or False, + "country": computation_line.src_dest_country_code, "hs_code_id": computation_line.hs_code_id.id or False, "intrastat_unit": computation_line.intrastat_unit_id.id or False, "transaction": computation_line.transaction_id.id or False, "transport": computation_line.transport_id.id or False, "region": computation_line.region_id.id or False, - "product_origin_country": computation_line.product_origin_country_id.id - or False, + "product_origin_country": computation_line.product_origin_country_code, } def group_line_hashcode(self, computation_line): @@ -746,6 +814,7 @@ def group_line_hashcode(self, computation_line): def _prepare_grouped_fields(self, computation_line, fields_to_sum): vals = { "src_dest_country_id": computation_line.src_dest_country_id.id, + "src_dest_country_code": computation_line.src_dest_country_code, "intrastat_unit_id": computation_line.intrastat_unit_id.id, "hs_code_id": computation_line.hs_code_id.id, "transaction_id": computation_line.transaction_id.id, @@ -753,6 +822,7 @@ def _prepare_grouped_fields(self, computation_line, fields_to_sum): "region_id": computation_line.region_id.id, "parent_id": computation_line.parent_id.id, "product_origin_country_id": computation_line.product_origin_country_id.id, + "product_origin_country_code": computation_line.product_origin_country_code, "amount_company_currency": 0.0, } for field in fields_to_sum: @@ -925,6 +995,15 @@ class IntrastatProductComputationLine(models.Model): help="Country of Origin/Destination", domain=[("intrastat", "=", True)], ) + src_dest_country_code = fields.Char( + string="Country Code", + compute="_compute_src_dest_country_code", + store=True, + required=True, + readonly=False, + help="2 digit code of country of origin/destination.\n" + "Specify 'XI' for UK Northern Ireland and 'XU' for rest of the UK.", + ) product_id = fields.Many2one( "product.product", related="invoice_line_id.product_id" ) @@ -962,14 +1041,36 @@ class IntrastatProductComputationLine(models.Model): "intrastat.transaction", string="Intrastat Transaction" ) region_id = fields.Many2one("intrastat.region", string="Intrastat Region") - # extended declaration - incoterm_id = fields.Many2one("account.incoterms", string="Incoterm") - transport_id = fields.Many2one("intrastat.transport_mode", string="Transport Mode") + # product_origin_country_id is replaced by product_origin_country_code + # this field should be dropped once the localisation modules have been + # adapted accordingly product_origin_country_id = fields.Many2one( "res.country", string="Country of Origin of the Product", help="Country of origin of the product i.e. product 'made in ____'", ) + product_origin_country_code = fields.Char( + string="Country of Origin of the Product", + size=2, + required=True, + default="QU", + help="2 digit code of country of origin of the product except for the UK.\n" + "Specify 'XI' for UK Northern Ireland and 'XU' for rest of the UK.\n" + "Specify 'QU' when the country is unknown.\n", + ) + vat = fields.Char(string="VAT Number") + + # extended declaration + incoterm_id = fields.Many2one("account.incoterms", string="Incoterm") + transport_id = fields.Many2one("intrastat.transport_mode", string="Transport Mode") + + @api.onchange("src_dest_country_id") + def _onchange_src_dest_country_id(self): + self.src_dest_country_code = self.src_dest_country_id.code + if self.parent_id.year >= "2021": + self.src_dest_country_code = self.env[ + "res.partner" + ]._get_intrastat_country_code(country=self.src_dest_country_id) @api.depends("transport_id") def _compute_check_validity(self): @@ -1021,6 +1122,12 @@ class IntrastatProductDeclarationLine(models.Model): help="Country of Origin/Destination", domain=[("intrastat", "=", True)], ) + src_dest_country_code = fields.Char( + string="Country Code", + required=True, + help="2 digit code of country of origin/destination.\n" + "Specify 'XI' for UK Northern Ireland and 'XU' for rest of the UK.", + ) hs_code_id = fields.Many2one("hs.code", string="Intrastat Code") intrastat_unit_id = fields.Many2one( "intrastat.unit", @@ -1042,11 +1149,32 @@ class IntrastatProductDeclarationLine(models.Model): "intrastat.transaction", string="Intrastat Transaction" ) region_id = fields.Many2one("intrastat.region", string="Intrastat Region") - # extended declaration - incoterm_id = fields.Many2one("account.incoterms", string="Incoterm") - transport_id = fields.Many2one("intrastat.transport_mode", string="Transport Mode") + # product_origin_country_id is replaced by product_origin_country_code + # this field should be dropped once the localisation modules have been + # adapted accordingly product_origin_country_id = fields.Many2one( "res.country", string="Country of Origin of the Product", help="Country of origin of the product i.e. product 'made in ____'", ) + product_origin_country_code = fields.Char( + string="Country of Origin of the Product", + size=2, + required=True, + default="QU", + help="2 digit code of country of origin of the product except for the UK.\n" + "Specify 'XI' for UK Northern Ireland and 'XU' for rest of the UK.\n" + "Specify 'QU' when the country is unknown.\n", + ) + vat = fields.Char(string="VAT Number") + # extended declaration + incoterm_id = fields.Many2one("account.incoterms", string="Incoterm") + transport_id = fields.Many2one("intrastat.transport_mode", string="Transport Mode") + + @api.onchange("src_dest_country_id") + def _onchange_src_dest_country_id(self): + self.src_dest_country_code = self.src_dest_country_id.code + if self.parent_id.year >= "2021": + self.src_dest_country_code = self.env[ + "res.partner" + ]._get_intrastat_country_code(country=self.src_dest_country_id) diff --git a/intrastat_product/readme/CONTRIBUTORS.rst b/intrastat_product/readme/CONTRIBUTORS.rst index 51e165672..6f483368f 100644 --- a/intrastat_product/readme/CONTRIBUTORS.rst +++ b/intrastat_product/readme/CONTRIBUTORS.rst @@ -1,2 +1,7 @@ * Alexis de Lattre, Akretion * Luc De Meyer, Noviat + + +* `Tecnativa `_: + + * Víctor Martínez diff --git a/intrastat_product/report/intrastat_product_report_xls.py b/intrastat_product/report/intrastat_product_report_xls.py index 7664dd97d..7affa55d0 100644 --- a/intrastat_product/report/intrastat_product_report_xls.py +++ b/intrastat_product/report/intrastat_product_report_xls.py @@ -1,4 +1,4 @@ -# Copyright 2009-2020 Noviat +# Copyright 2009-2022 Noviat # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import logging @@ -55,7 +55,7 @@ def _get_template(self, declaration): }, "line": { "type": "string", - "value": self._render("line.src_dest_country_id.name"), + "value": self._render("line.src_dest_country_code"), }, "width": 28, }, diff --git a/intrastat_product/static/description/index.html b/intrastat_product/static/description/index.html index eaa332055..6f3828164 100644 --- a/intrastat_product/static/description/index.html +++ b/intrastat_product/static/description/index.html @@ -3,7 +3,7 @@ - + Intrastat Product