@@ -211,41 +211,62 @@ def _domain_per_name(self, name):
211211 ]
212212
213213 def _domain_tax_group_field_ids (self ):
214- return self ._domain_per_name ("account.tax.group" )
214+ return self ._domain_per_name ("account.tax.group" ) + [
215+ ("ttype" , "!=" , "one2many" )
216+ ]
215217
216218 def _domain_tax_field_ids (self ):
217- return self ._domain_per_name ("account.tax" )
219+ # Allow specific o2m fields critical for comparison
220+ # (repartition_line_ids and variants) but exclude other o2m
221+ return self ._domain_per_name ("account.tax" ) + [
222+ "|" ,
223+ ("ttype" , "!=" , "one2many" ),
224+ (
225+ "name" ,
226+ "in" ,
227+ [
228+ "invoice_repartition_line_ids" ,
229+ "refund_repartition_line_ids" ,
230+ "repartition_line_ids" ,
231+ ],
232+ ),
233+ ]
218234
219235 def _domain_account_field_ids (self ):
220- return self ._domain_per_name ("account.account" )
236+ return self ._domain_per_name ("account.account" ) + [( "ttype" , "!=" , "one2many" )]
221237
222238 def _domain_account_group_field_ids (self ):
223- return self ._domain_per_name ("account.group" )
239+ return self ._domain_per_name ("account.group" ) + [( "ttype" , "!=" , "one2many" )]
224240
225241 def _domain_fp_field_ids (self ):
226- return self ._domain_per_name ("account.fiscal.position" )
242+ return self ._domain_per_name ("account.fiscal.position" ) + [
243+ ("ttype" , "!=" , "one2many" )
244+ ]
227245
228246 def _default_tax_group_field_ids (self ):
229247 return [
230248 (4 , x .id )
231249 for x in self .env ["ir.model.fields" ].search (
232- self ._domain_tax_group_field_ids () + [("ttype" , "!=" , "one2many" )],
250+ self ._domain_tax_group_field_ids ()
251+ + self .get_uncheck_fields_domain ("account.tax.group" ),
233252 )
234253 ]
235254
236255 def _default_tax_field_ids (self ):
237256 return [
238257 (4 , x .id )
239258 for x in self .env ["ir.model.fields" ].search (
240- self ._domain_tax_field_ids () + [("ttype" , "!=" , "one2many" )],
259+ self ._domain_tax_field_ids ()
260+ + self .get_uncheck_fields_domain ("account.tax" ),
241261 )
242262 ]
243263
244264 def _default_account_field_ids (self ):
245265 return [
246266 (4 , x .id )
247267 for x in self .env ["ir.model.fields" ].search (
248- self ._domain_account_field_ids () + [("ttype" , "!=" , "one2many" )],
268+ self ._domain_account_field_ids ()
269+ + self .get_uncheck_fields_domain ("account.account" ),
249270 )
250271 ]
251272
@@ -254,13 +275,17 @@ def _default_account_group_field_ids(self):
254275 (4 , x .id )
255276 for x in self .env ["ir.model.fields" ].search (
256277 self ._domain_account_group_field_ids ()
278+ + self .get_uncheck_fields_domain ("account.group" )
257279 )
258280 ]
259281
260282 def _default_fp_field_ids (self ):
261283 return [
262284 (4 , x .id )
263- for x in self .env ["ir.model.fields" ].search (self ._domain_fp_field_ids ())
285+ for x in self .env ["ir.model.fields" ].search (
286+ self ._domain_fp_field_ids ()
287+ + self .get_uncheck_fields_domain ("account.fiscal.position" )
288+ )
264289 ]
265290
266291 def _get_matching_ids (self , model_name , ordered_opts ):
@@ -494,22 +519,18 @@ def padded_code(self, code):
494519 def fields_to_ignore (self , name ):
495520 """Get fields that will not be used when checking differences.
496521
497- :param str template: A template record.
498522 :param str name: The name of the template model.
499523 :return set: Fields to ignore in diff.
500524 """
501525 mail_thread_fields = set (self .env ["mail.thread" ]._fields )
502526 specials_mapping = {
503527 "account.tax.group" : mail_thread_fields | {"sequence" },
504- "account.tax" : mail_thread_fields | {"children_tax_ids" , "sequence" },
528+ "account.tax" : mail_thread_fields | {"children_tax_ids" } | { "sequence" },
505529 "account.account" : mail_thread_fields
506530 | {
507531 "root_id" ,
508532 },
509- "account.group" : {"parent_id" , "code_prefix_end" },
510- "account.fiscal.position" : {
511- "sequence" ,
512- },
533+ "account.group" : {"parent_id" },
513534 }
514535 specials = {
515536 "display_name" ,
@@ -518,6 +539,22 @@ def fields_to_ignore(self, name):
518539 } | specials_mapping .get (name , set ())
519540 return set (models .MAGIC_COLUMNS ) | specials
520541
542+ @api .model
543+ def get_default_unchecked_fields (self , name ):
544+ """Get fields that should be unchecked by default for a given model.
545+
546+ :param str name: The name of the template model.
547+ :return set: Fields to uncheck by default.
548+ """
549+ unchecked_mapping = {
550+ "account.fiscal.position" : {"sequence" },
551+ }
552+ return unchecked_mapping .get (name , set ())
553+
554+ def get_uncheck_fields_domain (self , name ):
555+ unchecked_fields = list (self .get_default_unchecked_fields (name ))
556+ return [("name" , "not in" , unchecked_fields )]
557+
521558 @api .model
522559 def diff_fields (self , record_values , real ): # noqa: C901
523560 """Get fields that are different in record values and real records.
0 commit comments