2026-08-10 00:08:55 -04:00
|
|
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
|
|
|
# this repository contains the full copyright notices and license terms.
|
|
|
|
|
|
|
|
|
|
from sql import Table
|
|
|
|
|
from trytond.pool import PoolMeta
|
|
|
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
2026-08-10 09:09:59 -04:00
|
|
|
LEGACY_OBSOLETE_IDS = frozenset({
|
2026-08-10 00:08:55 -04:00
|
|
|
'do_tax_itbis_8_compra', 'do_tax_itbis_8_venta',
|
|
|
|
|
'do_tax_itbis_9_compra', 'do_tax_itbis_9_venta',
|
|
|
|
|
'do_tax_ret_itbis_2_adq',
|
|
|
|
|
'do_tax_rule_customer_card_acquirer',
|
|
|
|
|
'do_tax_rule_customer_itbis8', 'do_tax_rule_customer_itbis9',
|
|
|
|
|
'do_tax_rule_supplier_itbis8', 'do_tax_rule_supplier_itbis9',
|
|
|
|
|
'do_tc_itbis_compras_8', 'do_tc_itbis_compras_9',
|
|
|
|
|
'do_tc_itbis_retenido_adq',
|
|
|
|
|
'do_tc_itbis_ventas_8', 'do_tc_itbis_ventas_9',
|
|
|
|
|
'do_tcl_itbis8c_cr', 'do_tcl_itbis8c_inv',
|
|
|
|
|
'do_tcl_itbis8v_cr', 'do_tcl_itbis8v_inv',
|
|
|
|
|
'do_tcl_itbis9c_cr', 'do_tcl_itbis9c_inv',
|
|
|
|
|
'do_tcl_itbis9v_cr', 'do_tcl_itbis9v_inv',
|
|
|
|
|
'do_tcl_ret_itbis_adq_cr', 'do_tcl_ret_itbis_adq_inv',
|
|
|
|
|
'do_trline_cust_card_acquirer',
|
|
|
|
|
'do_trline_cust_itbis8', 'do_trline_cust_itbis9',
|
|
|
|
|
'do_trline_supp_itbis8', 'do_trline_supp_itbis9',
|
2026-08-10 09:09:59 -04:00
|
|
|
})
|
2026-08-10 00:08:55 -04:00
|
|
|
|
2026-08-10 09:09:59 -04:00
|
|
|
LOCALIZATION_MODELS = frozenset({
|
2026-08-10 00:08:55 -04:00
|
|
|
'account.account.template',
|
|
|
|
|
'account.account.type.template',
|
|
|
|
|
'account.tax.code.line.template',
|
|
|
|
|
'account.tax.code.template',
|
|
|
|
|
'account.tax.group',
|
|
|
|
|
'account.tax.rule.line.template',
|
|
|
|
|
'account.tax.rule.template',
|
|
|
|
|
'account.tax.template',
|
2026-08-10 09:09:59 -04:00
|
|
|
})
|
2026-08-10 00:08:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class ModelData(metaclass=PoolMeta):
|
|
|
|
|
__name__ = 'ir.model.data'
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def __register__(cls, module_name):
|
|
|
|
|
super().__register__(module_name)
|
|
|
|
|
|
|
|
|
|
if module_name != 'account_do': # pragma: no cover
|
|
|
|
|
return # Defensive guard for composite PoolMeta classes.
|
|
|
|
|
|
|
|
|
|
cls._migrate_localization_identifiers()
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def _migrate_localization_identifiers(cls):
|
|
|
|
|
"Preserve pre-language identifiers when upgrading from 8.0.0."
|
|
|
|
|
|
|
|
|
|
cursor = Transaction().connection.cursor()
|
|
|
|
|
table = Table(cls._table)
|
|
|
|
|
cursor.execute(*table.select(
|
|
|
|
|
table.id, table.fs_id,
|
|
|
|
|
where=(table.module == 'account_do')
|
2026-08-10 09:09:59 -04:00
|
|
|
& table.model.in_(tuple(sorted(LOCALIZATION_MODELS)))))
|
2026-08-10 00:08:55 -04:00
|
|
|
obsolete = []
|
|
|
|
|
for record_id, fs_id in cursor.fetchall():
|
|
|
|
|
if fs_id in LEGACY_OBSOLETE_IDS:
|
|
|
|
|
obsolete.append(record_id)
|
|
|
|
|
elif not fs_id.endswith(('_en', '_es_419')):
|
|
|
|
|
cursor.execute(*table.update(
|
|
|
|
|
[table.fs_id], [fs_id + '_es_419'],
|
|
|
|
|
where=table.id == record_id))
|
|
|
|
|
if obsolete:
|
|
|
|
|
# Retain referenced historical templates as user-owned records.
|
|
|
|
|
cursor.execute(*table.delete(where=table.id.in_(obsolete)))
|