11from odoo import api , fields , models
2+ from odoo .exceptions import UserError
23
34from 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
64113class 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 )
0 commit comments