intrastat_product: add confirmed state

Add a third step "confirmed" between "draft" and "done". It is necessary
to have error messages of XML file generation that refer to declaration
lines.

Add line_number on declaration line, to be used in error message when
generating XML file.

note field moved from fields.Text to fields.Html

Improve display_name of intrastat.product.declaration

Add store=True on 3 computed fields (reporting_level on
declaration, src_dest_country_code and product_origin_country_code on
computation lines). It fixes a bug on src_dest_country_code and
product_origin_country_code on computation lines, when you could not set
manually a country code while leaving the m2o field empty.
This commit is contained in:
Alexis de Lattre
2024-01-24 00:28:57 +01:00
parent a343c341f2
commit 94be790356
5 changed files with 75 additions and 31 deletions

View File

@@ -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",

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -14,18 +14,26 @@
class="btn-primary"
/>
<button
name="done"
name="draft2confirmed"
string="Confirm"
type="object"
class="btn-primary"
states="draft"
help="Generate declaration lines, generate XML export and set declaration to 'Done'"
help="Generate declaration lines"
/>
<button
name="confirmed2done"
string="Generate XML File"
type="object"
class="btn-primary"
states="confirmed"
help="Generate XML file and set declaration to 'Done'"
/>
<button
name="back2draft"
string="Back to Draft"
type="object"
states="done"
states="confirmed,done"
confirm="Are you sure you want to go back to draft?"
/>
<button
@@ -38,8 +46,7 @@
<sheet>
<div class="oe_title">
<h1>
<span>Intrastat Product Declaration </span>
<field name="year_month" class="oe_inline" />
<field name="display_name" />
</h1>
</div>
<group name="top-block">
@@ -81,7 +88,11 @@
nolabel="1"
/>
</page>
<page string="Declaration Lines" name="declaration_lines">
<page
string="Declaration Lines"
name="declaration_lines"
states="confirmed,done"
>
<field
name="declaration_line_ids"
context="{'declaration_type': declaration_type, 'reporting_level': reporting_level}"
@@ -89,7 +100,7 @@
/>
</page>
<page string="Notes" name="note">
<field name="note" widget="html" />
<field name="note" />
</page>
</notebook>
</sheet>
@@ -368,6 +379,7 @@
name="parent_id"
invisible="not context.get('intrastat_product_declaration_line_main_view')"
/>
<field name="line_number" />
<field name="declaration_type" invisible="1" />
<field name="reporting_level" invisible="1" />
<field name="company_country_code" invisible="1" />
@@ -437,6 +449,12 @@
<field name="declaration_type" invisible="1" />
<field name="reporting_level" invisible="1" />
<field name="company_country_code" invisible="1" />
<field
name="line_number"
optional="show"
string="Line"
decoration-bf="1"
/>
<field
name="hs_code_id"
attrs="{'column_invisible': [('parent.reporting_level', '!=', 'extended')]}"