Skip to content

Commit aea8dc7

Browse files
TheMule71Borruso
authored andcommitted
[FIX] l10n_it_edi_related_document: don't ignore standard fields
If standard fields are being used, keep a related document in sync: l10n_it_origin_document_type l10n_it_origin_document_name l10n_it_origin_document_date l10n_it_cig l10n_it_cup NOTE: this happens only programmatically, not via UI
1 parent d3e3ff6 commit aea8dc7

2 files changed

Lines changed: 183 additions & 1 deletion

File tree

l10n_it_edi_related_document/models/account_move.py

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from odoo import api, fields, models
2+
from odoo.exceptions import UserError
23

34
from odoo.addons.l10n_it_edi.models.account_move import get_text
45

@@ -58,7 +59,55 @@ def create(self, vals_list):
5859
)
5960
if line:
6061
vals["invoice_line_id"] = line.id
61-
return super().create(vals_list)
62+
ret = super().create(vals_list)
63+
# after creating documents, check if one should is eligible
64+
# to become the standard_related_document_id
65+
for record in ret.filtered(
66+
lambda r: r.type == "order"
67+
and r.invoice_id
68+
and not r.invoice_id.standard_related_document_id
69+
):
70+
invoice = record.invoice_id.with_context(
71+
l10n_it_edi_related_loop_avoid=True
72+
)
73+
invoice.standard_related_document_id = record
74+
invoice.l10n_it_origin_document_type = "purchase_order"
75+
invoice.l10n_it_origin_document_name = record.name
76+
invoice.l10n_it_origin_document_date = record.date
77+
invoice.l10n_it_cig = record.cig
78+
record.invoice_id.l10n_it_cup = record.cup
79+
80+
return ret
81+
82+
def _l10n_it_sync_related_document(self):
83+
for record in self:
84+
if record == record.invoice_id.standard_related_document_id:
85+
document_type = record.type
86+
if document_type == "order":
87+
document_type = "purchase_order"
88+
elif document_type == "reception":
89+
# unsupported type
90+
record.invoice_id.standard_related_document_id = False
91+
continue
92+
elif document_type == "invoice":
93+
# unsupported type
94+
record.invoice_id.standard_related_document_id = False
95+
continue
96+
record.invoice_id.l10n_it_origin_document_type = document_type
97+
record.invoice_id.l10n_it_origin_document_name = record.name
98+
record.invoice_id.l10n_it_origin_document_date = record.date
99+
record.invoice_id.l10n_it_cig = record.cig
100+
record.invoice_id.l10n_it_cup = record.cup
101+
102+
def write(self, vals):
103+
ret = super().write(vals)
104+
if self._context.get("l10n_it_edi_related_loop_avoid"):
105+
return ret
106+
if vals.keys() & {"type", "name", "date", "cig", "cup"}:
107+
self.with_context(
108+
l10n_it_edi_related_loop_avoid=True
109+
)._l10n_it_sync_related_document()
110+
return ret
62111

63112

64113
class AccountMove(models.Model):
@@ -68,6 +117,78 @@ class AccountMove(models.Model):
68117
"account.move.related_document", "invoice_id", copy=False
69118
)
70119

120+
standard_related_document_id = fields.Many2one(
121+
comodel_name="account.move.related_document",
122+
string="Standard Related Document",
123+
help="Technical field to store the document corresponding to standard fields",
124+
)
125+
126+
# override
127+
l10n_it_origin_document_type = fields.Selection(
128+
inverse="_inverse_original_related_document_fields"
129+
)
130+
l10n_it_origin_document_name = fields.Char(
131+
inverse="_inverse_original_related_document_fields"
132+
)
133+
l10n_it_origin_document_date = fields.Date(
134+
inverse="_inverse_original_related_document_fields"
135+
)
136+
l10n_it_cig = fields.Char(inverse="_inverse_original_related_document_fields")
137+
l10n_it_cup = fields.Char(inverse="_inverse_original_related_document_fields")
138+
139+
def _inverse_original_related_document_fields(self):
140+
for record in self:
141+
if record._context.get("l10n_it_edi_related_loop_avoid"):
142+
continue
143+
if (
144+
not record.l10n_it_origin_document_type
145+
or not record.l10n_it_origin_document_name
146+
):
147+
if record.standard_related_document_id:
148+
# deleted reference
149+
record.related_document_ids = [
150+
fields.Command.unlink(record.standard_related_document_id.id)
151+
]
152+
record.standard_related_document_id.unlink()
153+
record.standard_related_document_id = False
154+
continue
155+
# type map
156+
# purchase_order -> order
157+
# contract -> contract
158+
# agreement -> agreement
159+
# ? -> reception
160+
# ? -> invoice
161+
document_type = record.l10n_it_origin_document_type
162+
if document_type == "purchase_order":
163+
document_type = "order"
164+
165+
if (
166+
document_type
167+
not in dict(
168+
self.env["account.move.related_document"]._fields["type"].selection
169+
).keys()
170+
):
171+
raise UserError(self.env._("Unknown document type %s", document_type))
172+
173+
vals = {
174+
"type": document_type,
175+
"name": self.l10n_it_origin_document_name,
176+
"date": self.l10n_it_origin_document_date,
177+
"cig": self.l10n_it_cig,
178+
"cup": self.l10n_it_cup,
179+
}
180+
if not record.standard_related_document_id:
181+
self.standard_related_document_id = self.env[
182+
"account.move.related_document"
183+
].create(vals)
184+
self.related_document_ids = [
185+
fields.Command.link(self.standard_related_document_id.id)
186+
]
187+
else:
188+
self.standard_related_document_id.with_context(
189+
l10n_it_edi_related_loop_avoid=True
190+
).update(vals)
191+
71192
def _l10n_it_edi_get_values(self, pdf_values=None):
72193
res = super()._l10n_it_edi_get_values(pdf_values=pdf_values)
73194
updated_values = self.remove_redundant_values(res)

l10n_it_edi_related_document/tests/test_import_xml.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,64 @@ def test_receive_vendor_bill(self):
3131
self.assertTrue(
3232
invoice.line_ids.filtered(lambda x: rcp_doc_type in x.related_document_ids)
3333
)
34+
35+
def test_standard_fields(self):
36+
euro = self.setup_other_currency("EUR")
37+
invoice = self.env["account.move"].create(
38+
{
39+
"move_type": "out_invoice",
40+
"partner_id": self.partner_a.id,
41+
"invoice_date": fields.Date.from_string("2016-01-01"),
42+
"currency_id": euro.id,
43+
"invoice_line_ids": [
44+
(
45+
0,
46+
None,
47+
{
48+
"product_id": self.product_a.id,
49+
"quantity": 3,
50+
"price_unit": 750,
51+
},
52+
),
53+
],
54+
}
55+
)
56+
57+
# add a document, via standard fields
58+
# note: this must be an atomic write(), as both name and type are required
59+
# fields and can't be assigned one a time
60+
invoice.write(
61+
{
62+
"l10n_it_origin_document_name": "S00001",
63+
"l10n_it_origin_document_type": "purchase_order",
64+
"l10n_it_origin_document_date": invoice.invoice_date,
65+
"l10n_it_cig": "CIG",
66+
"l10n_it_cup": "CUP",
67+
}
68+
)
69+
self.assertEqual(
70+
invoice.standard_related_document_id, invoice.related_document_ids[0]
71+
)
72+
self.assertEqual(invoice.standard_related_document_id.type, "order")
73+
self.assertEqual(invoice.standard_related_document_id.name, "S00001")
74+
self.assertEqual(
75+
invoice.standard_related_document_id.date, invoice.invoice_date
76+
)
77+
self.assertEqual(invoice.standard_related_document_id.cig, "CIG")
78+
self.assertEqual(invoice.standard_related_document_id.cup, "CUP")
79+
80+
# alter the document
81+
invoice.standard_related_document_id.name = "S00002"
82+
invoice.standard_related_document_id.date = fields.Date.from_string(
83+
"2016-01-02"
84+
)
85+
invoice.standard_related_document_id.cig = "CIG2"
86+
invoice.standard_related_document_id.cup = "CUP2"
87+
88+
# check if standard fields changed accordingly
89+
self.assertEqual(invoice.l10n_it_origin_document_name, "S00002")
90+
self.assertEqual(
91+
invoice.l10n_it_origin_document_date, fields.Date.from_string("2016-01-02")
92+
)
93+
self.assertEqual(invoice.l10n_it_cig, "CIG2")
94+
self.assertEqual(invoice.l10n_it_cup, "CUP2")

0 commit comments

Comments
 (0)