diff --git a/intrastat_product/models/intrastat_product_declaration.py b/intrastat_product/models/intrastat_product_declaration.py index 8b778f7..c9d0919 100644 --- a/intrastat_product/models/intrastat_product_declaration.py +++ b/intrastat_product/models/intrastat_product_declaration.py @@ -46,7 +46,8 @@ class IntrastatProductDeclaration(models.Model): comodel_name="res.company", string="Company", required=True, - states={"done": [("readonly", True)]}, + readonly=True, + states={"draft": [("readonly", False)]}, default=lambda self: self.env.company, ) company_country_code = fields.Char( @@ -55,18 +56,20 @@ class IntrastatProductDeclaration(models.Model): store=True, ) state = fields.Selection( - selection=[("draft", "Draft"), ("done", "Done")], + selection=[("draft", "Draft"), ("confirmed", "Confirmed"), ("done", "Done")], readonly=True, tracking=True, copy=False, default="draft", - help="State of the declaration. When the state is set to 'Done', " - "the parameters become read-only.", ) - note = fields.Text( - string="Notes", help="You can add some comments here if you want." + note = fields.Html( + string="Notes", + ) + year = fields.Char( + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, ) - year = fields.Char(required=True, states={"done": [("readonly", True)]}) month = fields.Selection( selection=[ ("01", "01"), @@ -83,7 +86,8 @@ class IntrastatProductDeclaration(models.Model): ("12", "12"), ], required=True, - states={"done": [("readonly", True)]}, + readonly=True, + states={"draft": [("readonly", False)]}, ) year_month = fields.Char( compute="_compute_year_month", @@ -96,8 +100,9 @@ class IntrastatProductDeclaration(models.Model): selection="_get_declaration_type", string="Type", required=True, - states={"done": [("readonly", True)]}, tracking=True, + readonly=True, + states={"draft": [("readonly", False)]}, ) action = fields.Selection( selection="_get_action", @@ -115,7 +120,8 @@ class IntrastatProductDeclaration(models.Model): comodel_name="intrastat.product.computation.line", inverse_name="parent_id", string="Intrastat Product Computation Lines", - states={"done": [("readonly", True)]}, + readonly=True, + states={"draft": [("readonly", False)]}, ) declaration_line_ids = fields.One2many( comodel_name="intrastat.product.declaration.line", @@ -141,8 +147,9 @@ class IntrastatProductDeclaration(models.Model): reporting_level = fields.Selection( selection="_get_reporting_level", compute="_compute_reporting_level", - readonly=False, - states={"done": [("readonly", True)]}, + readonly=True, + store=True, + states={"draft": [("readonly", False)]}, ) xml_attachment_id = fields.Many2one("ir.attachment", string="XML Attachment") xml_attachment_datas = fields.Binary( @@ -233,6 +240,7 @@ class IntrastatProductDeclaration(models.Model): ) this.reporting_level = reporting_level + @api.depends("declaration_type", "year_month") def name_get(self): res = [] type2label = dict( @@ -241,7 +249,11 @@ class IntrastatProductDeclaration(models.Model): ] ) for rec in self: - name = "%s %s" % (rec.year_month, type2label.get(rec.declaration_type)) + name = _( + "Intrastat Product Declaration %(declaration_type)s %(year_month)s", + year_month=rec.year_month, + declaration_type=type2label.get(rec.declaration_type), + ) res.append((rec.id, name)) return res @@ -839,10 +851,16 @@ class IntrastatProductDeclaration(models.Model): else: dl_group[hashcode] |= cl ipdl = self.declaration_line_ids + line_number = 1 for cl_lines in dl_group.values(): + # TODO v17: pass line_number as argument of _prepare_declaration_line() + # we can't afford to modify the proto of _prepare_declaration_line() in v16 vals = cl_lines._prepare_declaration_line() - declaration_line = ipdl.create(vals) + declaration_line = ipdl.with_context( + default_line_number=line_number + ).create(vals) cl_lines.write({"declaration_line_id": declaration_line.id}) + line_number += 1 def _check_generate_xml(self): self.ensure_one() @@ -960,9 +978,13 @@ class IntrastatProductDeclaration(models.Model): ) return filename - def done(self): + def draft2confirmed(self): for decl in self: decl.generate_declaration() + self.write({"state": "confirmed"}) + + def confirmed2done(self): + for decl in self: decl.generate_xml() self.write({"state": "done"}) @@ -1017,8 +1039,8 @@ class IntrastatProductComputationLine(models.Model): src_dest_country_code = fields.Char( compute="_compute_src_dest_country_code", string="Country Code", - required=True, readonly=False, + store=True, help="2 letters code of the country of origin/destination.\n" "Specify 'XI' for Northern Ireland.", ) @@ -1075,8 +1097,8 @@ class IntrastatProductComputationLine(models.Model): compute="_compute_product_origin_country_code", string="Country Code of Origin of the Product", size=2, - required=True, readonly=False, + store=True, help="2 letters ISO code of the country of origin of the product.\n" "Specify 'QU' when the country of origin is unknown.\n", ) @@ -1211,6 +1233,9 @@ class IntrastatProductDeclarationLine(models.Model): ondelete="cascade", readonly=True, ) + # line_number is used by localization modules to point the user to a specific + # declaration line in an error messages when generation the XML file + line_number = fields.Integer(readonly=True) company_id = fields.Many2one(related="parent_id.company_id") company_currency_id = fields.Many2one( related="company_id.currency_id", string="Company currency" @@ -1229,7 +1254,6 @@ class IntrastatProductDeclarationLine(models.Model): ) src_dest_country_code = fields.Char( string="Country Code", - required=True, help="2 letters ISO code of the country of origin/destination.\n" "Specify 'XI' for Northern Ireland and 'XU' for Great Britain.", ) @@ -1260,8 +1284,6 @@ class IntrastatProductDeclarationLine(models.Model): product_origin_country_code = fields.Char( string="Country of Origin of the Product", size=2, - required=True, - default="QU", help="2 letters ISO code of the country of origin of the product except for the UK.\n" "Specify 'XI' for Northern Ireland and 'XU' for Great Britain.\n" "Specify 'QU' when the country is unknown.\n", diff --git a/intrastat_product/security/ir.model.access.csv b/intrastat_product/security/ir.model.access.csv index 0fc2a99..30cc5b1 100644 --- a/intrastat_product/security/ir.model.access.csv +++ b/intrastat_product/security/ir.model.access.csv @@ -13,6 +13,9 @@ access_read_purchase_move_intrastat_line,Read access to Purchase User on Invoice access_read_account_move_intrastat_line,Read access on Invoice Intrastat Lines,model_account_move_intrastat_line,account.group_account_readonly,1,0,0,0 access_account_move_intrastat_line,Full access on Invoice Intrastat Lines,model_account_move_intrastat_line,account.group_account_invoice,1,1,1,1 access_intrastat_product_declaration,Full access on Intrastat Product Declarations to Accountant,model_intrastat_product_declaration,account.group_account_user,1,1,1,1 +access_intrastat_product_declaration_readonly,Read-only access on Intrastat Product Declarations to Auditor,model_intrastat_product_declaration,account.group_account_readonly,1,0,0,0 access_intrastat_product_computation_line,Full access on Intrastat Product Computation Lines to Accountant,model_intrastat_product_computation_line,account.group_account_user,1,1,1,1 +access_intrastat_product_computation_line_readonly,Readon-only access on Intrastat Product Computation Lines to Auditor,model_intrastat_product_computation_line,account.group_account_readonly,1,0,0,0 access_intrastat_product_declaration_line,Full access on Intrastat Product Declaration Lines to Accountant,model_intrastat_product_declaration_line,account.group_account_user,1,1,1,1 +access_intrastat_product_declaration_line_readonly,Read-only access on Intrastat Product Declaration Lines to Auditor,model_intrastat_product_declaration_line,account.group_account_readonly,1,0,0,0 access_intrastat_result_view,Access on intrastat.result.view,model_intrastat_result_view,account.group_account_user,1,1,1,0 diff --git a/intrastat_product/tests/test_brexit.py b/intrastat_product/tests/test_brexit.py index e382203..764b6cb 100644 --- a/intrastat_product/tests/test_brexit.py +++ b/intrastat_product/tests/test_brexit.py @@ -57,7 +57,8 @@ class TestIntrastatBrexit(IntrastatProductCommon, TransactionCase): } ) self.declaration.action_gather() - self.declaration.done() + self.declaration.draft2confirmed() + self.declaration.confirmed2done() cline = self.declaration.computation_line_ids dline = self.declaration.declaration_line_ids self.assertEqual(cline.src_dest_country_code, "XI") @@ -84,7 +85,8 @@ class TestIntrastatBrexit(IntrastatProductCommon, TransactionCase): } ) self.declaration.action_gather() - self.declaration.done() + self.declaration.draft2confirmed() + self.declaration.confirmed2done() clines = self.declaration.computation_line_ids cl_uk = clines.filtered(lambda r: r.product_id == self.product_uk) dlines = self.declaration.declaration_line_ids diff --git a/intrastat_product/tests/test_purchase_order.py b/intrastat_product/tests/test_purchase_order.py index 3d0dc9a..f88e806 100644 --- a/intrastat_product/tests/test_purchase_order.py +++ b/intrastat_product/tests/test_purchase_order.py @@ -45,7 +45,8 @@ class TestIntrastatProductPurchase(IntrastatPurchaseCommon): self.declaration.action_gather() self._check_line_values() - self.declaration.done() + self.declaration.draft2confirmed() + self.declaration.confirmed2done() self._check_line_values(final=True) # Check the Excel file diff --git a/intrastat_product/tests/test_sale_order.py b/intrastat_product/tests/test_sale_order.py index f4cab23..6eefce5 100644 --- a/intrastat_product/tests/test_sale_order.py +++ b/intrastat_product/tests/test_sale_order.py @@ -80,7 +80,8 @@ class TestIntrastatProductSale(IntrastatSaleCommon): self.declaration.action_gather() self._check_line_values() - self.declaration.done() + self.declaration.draft2confirmed() + self.declaration.confirmed2done() self._check_line_values(final=True) # Check the Excel file diff --git a/intrastat_product/views/intrastat_product_declaration.xml b/intrastat_product/views/intrastat_product_declaration.xml index 42d03d9..0866321 100644 --- a/intrastat_product/views/intrastat_product_declaration.xml +++ b/intrastat_product/views/intrastat_product_declaration.xml @@ -12,21 +12,33 @@ attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('action', '=', 'nihil')]}" string="Generate Lines from Invoices" class="btn-primary" + groups="account.group_account_user" /> + - Intrastat Product Declaration - + @@ -81,7 +92,11 @@ nolabel="1" /> - + - + @@ -150,6 +165,11 @@ string="Draft" domain="[('state', '=', 'draft')]" /> + + @@ -368,6 +393,7 @@ name="parent_id" invisible="not context.get('intrastat_product_declaration_line_main_view')" /> + @@ -437,6 +463,12 @@ +