Remove Property fields
issue2349 review34831002
This commit is contained in:
1 parent
7d1fc0e68e
commit
e019315e9c
8 files changed
+297
-180
No files matched your search
@@ -41,9 +41,12 @@ def register():
|
||||
AgedBalanceContext,
|
||||
AgedBalance,
|
||||
Configuration,
|
||||
ConfigurationDefaultAccount,
|
||||
Period,
|
||||
JournalType,
|
||||
Journal,
|
||||
JournalSequence,
|
||||
JournalAccount,
|
||||
JournalCashContext,
|
||||
JournalPeriod,
|
||||
Move,
|
||||
@@ -75,6 +78,7 @@ def register():
|
||||
CreateMoveTemplate,
|
||||
CreateMoveKeywords,
|
||||
Party,
|
||||
PartyAccount,
|
||||
module='account', type_='model')
|
||||
Pool.register(
|
||||
OpenType,
|
||||
|
||||
+10
-36
@@ -2004,44 +2004,18 @@ class CreateChart(Wizard):
|
||||
|
||||
def transition_create_properties(self):
|
||||
pool = Pool()
|
||||
Property = pool.get('ir.property')
|
||||
ModelField = pool.get('ir.model.field')
|
||||
Configuration = pool.get('account.configuration')
|
||||
|
||||
with Transaction().set_context(company=self.properties.company.id):
|
||||
account_receivable_field, = ModelField.search([
|
||||
('model.model', '=', 'party.party'),
|
||||
('name', '=', 'account_receivable'),
|
||||
], limit=1)
|
||||
properties = Property.search([
|
||||
('field', '=', account_receivable_field.id),
|
||||
('res', '=', None),
|
||||
('company', '=', self.properties.company.id),
|
||||
])
|
||||
Property.delete(properties)
|
||||
if self.properties.account_receivable:
|
||||
Property.create([{
|
||||
'field': account_receivable_field.id,
|
||||
'value': str(
|
||||
self.properties.account_receivable),
|
||||
'company': self.properties.company.id,
|
||||
}])
|
||||
|
||||
account_payable_field, = ModelField.search([
|
||||
('model.model', '=', 'party.party'),
|
||||
('name', '=', 'account_payable'),
|
||||
], limit=1)
|
||||
properties = Property.search([
|
||||
('field', '=', account_payable_field.id),
|
||||
('res', '=', None),
|
||||
('company', '=', self.properties.company.id),
|
||||
])
|
||||
Property.delete(properties)
|
||||
if self.properties.account_payable:
|
||||
Property.create([{
|
||||
'field': account_payable_field.id,
|
||||
'value': str(self.properties.account_payable),
|
||||
'company': self.properties.company.id,
|
||||
}])
|
||||
account_receivable = self.properties.account_receivable
|
||||
account_payable = self.properties.account_payable
|
||||
config = Configuration(1)
|
||||
config.set_multivalue(
|
||||
'default_account_receivable',
|
||||
account_receivable.id if account_receivable else None)
|
||||
config.set_multivalue(
|
||||
'default_account_payable',
|
||||
account_payable.id if account_payable else None)
|
||||
return 'end'
|
||||
|
||||
|
||||
|
||||
+63
-81
@@ -1,112 +1,94 @@
|
||||
# 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 trytond.model import (ModelView, ModelSQL,
|
||||
ModelSingleton, MatchMixin, fields, sequence_ordered)
|
||||
from trytond import backend
|
||||
from trytond.pool import Pool
|
||||
from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.pyson import Eval
|
||||
from trytond.modules.company.model import (
|
||||
CompanyMultiValueMixin, CompanyValueMixin)
|
||||
|
||||
__all__ = ['Configuration', 'ConfigurationTaxRounding']
|
||||
|
||||
__all__ = ['Configuration', 'ConfigurationDefaultAccount',
|
||||
'ConfigurationTaxRounding']
|
||||
tax_roundings = [
|
||||
('document', 'Per Document'),
|
||||
('line', 'Per Line'),
|
||||
]
|
||||
|
||||
|
||||
class Configuration(ModelSingleton, ModelSQL, ModelView):
|
||||
class Configuration(
|
||||
ModelSingleton, ModelSQL, ModelView, CompanyMultiValueMixin):
|
||||
'Account Configuration'
|
||||
__name__ = 'account.configuration'
|
||||
default_account_receivable = fields.Function(fields.Many2One(
|
||||
'account.account', 'Default Account Receivable',
|
||||
domain=[
|
||||
default_account_receivable = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Default Account Receivable",
|
||||
domain=[
|
||||
('kind', '=', 'receivable'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
]),
|
||||
'get_account', setter='set_account')
|
||||
default_account_payable = fields.Function(fields.Many2One(
|
||||
'account.account', 'Default Account Payable',
|
||||
domain=[
|
||||
]))
|
||||
default_account_payable = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Default Account Payable",
|
||||
domain=[
|
||||
('kind', '=', 'payable'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
]),
|
||||
'get_account', setter='set_account')
|
||||
tax_rounding = fields.Function(fields.Selection(tax_roundings,
|
||||
'Tax Rounding'), 'on_change_with_tax_rounding')
|
||||
tax_roundings = fields.One2Many('account.configuration.tax_rounding',
|
||||
'configuration', 'Tax Roundings')
|
||||
]))
|
||||
tax_rounding = fields.MultiValue(fields.Selection(
|
||||
tax_roundings, "Tax Rounding"))
|
||||
|
||||
@classmethod
|
||||
def default_tax_rounding(cls):
|
||||
return 'document'
|
||||
def multivalue_model(cls, field):
|
||||
pool = Pool()
|
||||
if field in {'default_account_receivable', 'default_account_payable'}:
|
||||
return pool.get('account.configuration.default_account')
|
||||
return super(Configuration, cls).multivalue_model(field)
|
||||
|
||||
@classmethod
|
||||
def _get_account_field(cls, name):
|
||||
pool = Pool()
|
||||
ModelField = pool.get('ir.model.field')
|
||||
if name in ['default_account_receivable', 'default_account_payable']:
|
||||
field, = ModelField.search([
|
||||
('model.model', '=', 'party.party'),
|
||||
('name', '=', name[8:]),
|
||||
], limit=1)
|
||||
return field
|
||||
|
||||
def get_account(self, name):
|
||||
pool = Pool()
|
||||
Property = pool.get('ir.property')
|
||||
company_id = Transaction().context.get('company')
|
||||
account_field = self._get_account_field(name)
|
||||
properties = Property.search([
|
||||
('field', '=', account_field.id),
|
||||
('res', '=', None),
|
||||
('company', '=', company_id),
|
||||
], limit=1)
|
||||
if properties:
|
||||
prop, = properties
|
||||
return prop.value.id
|
||||
|
||||
@classmethod
|
||||
def set_account(cls, configurations, name, value):
|
||||
pool = Pool()
|
||||
Property = pool.get('ir.property')
|
||||
company_id = Transaction().context.get('company')
|
||||
account_field = cls._get_account_field(name)
|
||||
properties = Property.search([
|
||||
('field', '=', account_field.id),
|
||||
('res', '=', None),
|
||||
('company', '=', company_id),
|
||||
])
|
||||
Property.delete(properties)
|
||||
if value:
|
||||
Property.create([{
|
||||
'field': account_field.id,
|
||||
'value': 'account.account,%s' % value,
|
||||
'company': company_id,
|
||||
}])
|
||||
|
||||
@fields.depends('tax_roundings')
|
||||
def on_change_with_tax_rounding(self, name=None, pattern=None):
|
||||
context = Transaction().context
|
||||
if pattern is None:
|
||||
pattern = {}
|
||||
pattern = pattern.copy()
|
||||
pattern['company'] = context.get('company')
|
||||
|
||||
for line in self.tax_roundings:
|
||||
if line.match(pattern):
|
||||
return line.method
|
||||
return self.default_tax_rounding()
|
||||
def default_tax_rounding(cls, **pattern):
|
||||
return cls.multivalue_model('tax_rounding').default_tax_rounding()
|
||||
|
||||
|
||||
class ConfigurationTaxRounding(
|
||||
sequence_ordered(), ModelSQL, ModelView, MatchMixin):
|
||||
class ConfigurationDefaultAccount(ModelSQL, CompanyValueMixin):
|
||||
"Account Configuration Default Account"
|
||||
__name__ = 'account.configuration.default_account'
|
||||
default_account_receivable = fields.Many2One(
|
||||
'account.account', "Default Account Receivable",
|
||||
domain=[
|
||||
('kind', '=', 'receivable'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
],
|
||||
depends=['company'])
|
||||
default_account_payable = fields.Many2One(
|
||||
'account.account', "Default Account Payable",
|
||||
domain=[
|
||||
('kind', '=', 'payable'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
],
|
||||
depends=['company'])
|
||||
|
||||
|
||||
class ConfigurationTaxRounding(ModelSQL, CompanyValueMixin):
|
||||
'Account Configuration Tax Rounding'
|
||||
__name__ = 'account.configuration.tax_rounding'
|
||||
configuration = fields.Many2One('account.configuration', 'Configuration',
|
||||
required=True, ondelete='CASCADE')
|
||||
company = fields.Many2One('company.company', 'Company')
|
||||
method = fields.Selection(tax_roundings, 'Method', required=True)
|
||||
tax_rounding = fields.Selection(tax_roundings, 'Method', required=True)
|
||||
|
||||
@classmethod
|
||||
def default_method(cls):
|
||||
def __register__(cls, module_name):
|
||||
TableHandler = backend.get('TableHandler')
|
||||
sql_table = cls.__table__()
|
||||
cursor = Transaction().connection.cursor()
|
||||
|
||||
super(ConfigurationTaxRounding, cls).__register__(module_name)
|
||||
|
||||
table = TableHandler(cls, module_name)
|
||||
|
||||
# Migration from 4.2: rename method into tax_rounding
|
||||
if table.column_exist('method'):
|
||||
cursor.execute(*sql_table.update(
|
||||
[sql_table.tax_rounding], [sql_table.method]))
|
||||
table.drop_column('method')
|
||||
|
||||
@classmethod
|
||||
def default_tax_rounding(cls):
|
||||
return 'document'
|
||||
@@ -42,35 +42,5 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="configuration_tax_rounding_view_form">
|
||||
<field name="model">account.configuration.tax_rounding</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">configuration_tax_rounding_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="configuration_tax_rounding_view_list">
|
||||
<field name="model">account.configuration.tax_rounding</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">configuration_tax_rounding_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_configuration_tax_rounding">
|
||||
<field name="model"
|
||||
search="[('model', '=', 'account.configuration.tax_rounding')]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
<record model="ir.model.access"
|
||||
id="access_configuration_tax_rounding_account_admin">
|
||||
<field name="model"
|
||||
search="[('model', '=', 'account.configuration.tax_rounding')]"/>
|
||||
<field name="group" ref="account.group_account_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
+117
-19
@@ -12,8 +12,11 @@ from trytond.pyson import Eval, Bool
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.pool import Pool
|
||||
from trytond.tools import reduce_ids, grouped_slice
|
||||
from trytond.tools.multivalue import migrate_property
|
||||
from trytond.modules.company.model import (
|
||||
CompanyMultiValueMixin, CompanyValueMixin)
|
||||
|
||||
__all__ = ['JournalType', 'Journal',
|
||||
__all__ = ['JournalType', 'Journal', 'JournalSequence', 'JournalAccount',
|
||||
'JournalCashContext',
|
||||
'JournalPeriod', 'CloseJournalPeriod', 'ReOpenJournalPeriod']
|
||||
|
||||
@@ -44,21 +47,28 @@ class JournalType(ModelSQL, ModelView):
|
||||
cls._order.insert(0, ('code', 'ASC'))
|
||||
|
||||
|
||||
class Journal(ModelSQL, ModelView):
|
||||
class Journal(ModelSQL, ModelView, CompanyMultiValueMixin):
|
||||
'Journal'
|
||||
__name__ = 'account.journal'
|
||||
name = fields.Char('Name', size=None, required=True, translate=True)
|
||||
code = fields.Char('Code', size=None)
|
||||
active = fields.Boolean('Active', select=True)
|
||||
type = fields.Selection('get_types', 'Type', required=True)
|
||||
sequence = fields.Property(fields.Many2One('ir.sequence', 'Sequence',
|
||||
domain=[('code', '=', 'account.journal')],
|
||||
context={'code': 'account.journal'},
|
||||
sequence = fields.MultiValue(fields.Many2One(
|
||||
'ir.sequence', "Sequence",
|
||||
domain=[
|
||||
('code', '=', 'account.journal'),
|
||||
('company', 'in', [
|
||||
Eval('context', {}).get('company', -1), None]),
|
||||
],
|
||||
states={
|
||||
'required': Bool(Eval('context', {}).get('company', -1)),
|
||||
}))
|
||||
credit_account = fields.Property(fields.Many2One('account.account',
|
||||
'Default Credit Account', domain=[
|
||||
sequences = fields.One2Many(
|
||||
'account.journal.sequence', 'journal', "Sequences")
|
||||
credit_account = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Default Credit Account",
|
||||
domain=[
|
||||
('kind', '!=', 'view'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
],
|
||||
@@ -66,9 +76,11 @@ class Journal(ModelSQL, ModelView):
|
||||
'required': ((Eval('type').in_(['cash', 'write-off']))
|
||||
& (Eval('context', {}).get('company', -1) != -1)),
|
||||
'invisible': ~Eval('context', {}).get('company', -1),
|
||||
}, depends=['type']))
|
||||
debit_account = fields.Property(fields.Many2One('account.account',
|
||||
'Default Debit Account', domain=[
|
||||
},
|
||||
depends=['type']))
|
||||
debit_account = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Default Debit Account",
|
||||
domain=[
|
||||
('kind', '!=', 'view'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
],
|
||||
@@ -76,7 +88,10 @@ class Journal(ModelSQL, ModelView):
|
||||
'required': ((Eval('type').in_(['cash', 'write-off']))
|
||||
& (Eval('context', {}).get('company', -1) != -1)),
|
||||
'invisible': ~Eval('context', {}).get('company', -1),
|
||||
}, depends=['type']))
|
||||
},
|
||||
depends=['type']))
|
||||
accounts = fields.One2Many(
|
||||
'account.journal.account', 'journal', "Accounts")
|
||||
debit = fields.Function(fields.Numeric('Debit',
|
||||
digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']), 'get_debit_credit_balance')
|
||||
@@ -96,22 +111,32 @@ class Journal(ModelSQL, ModelView):
|
||||
|
||||
@classmethod
|
||||
def __register__(cls, module_name):
|
||||
pool = Pool()
|
||||
JournalSequence = pool.get('account.journal.sequence')
|
||||
TableHandler = backend.get('TableHandler')
|
||||
sql_table = cls.__table__()
|
||||
journal_sequence = JournalSequence.__table__()
|
||||
|
||||
super(Journal, cls).__register__(module_name)
|
||||
|
||||
cursor = Transaction().connection.cursor()
|
||||
table = TableHandler(cls, module_name)
|
||||
|
||||
# Migration from 1.0 sequence Many2One change into Property
|
||||
# Migration from 1.0 sequence Many2One change into MultiValue
|
||||
if table.column_exist('sequence'):
|
||||
Property = Pool().get('ir.property')
|
||||
sql_table = cls.__table__()
|
||||
cursor.execute(*sql_table.select(sql_table.id, sql_table.sequence))
|
||||
for journal_id, sequence_id in cursor.fetchall():
|
||||
Property.set('sequence', cls._name,
|
||||
journal_id, (sequence_id and
|
||||
'ir.sequence,' + str(sequence_id) or False))
|
||||
query = journal_sequence.insert(
|
||||
[journal_sequence.journal, journal_sequence.sequence],
|
||||
sql_table.select(sql_table.id, sql_table.sequence))
|
||||
cursor.execute(*query)
|
||||
table.drop_column('sequence', exception=True)
|
||||
|
||||
@classmethod
|
||||
def multivalue_model(cls, field):
|
||||
pool = Pool()
|
||||
if field in {'credit_account', 'debit_account'}:
|
||||
return pool.get('account.journal.account')
|
||||
return super(Journal, cls).multivalue_model(field)
|
||||
|
||||
@staticmethod
|
||||
def default_active():
|
||||
return True
|
||||
@@ -202,6 +227,79 @@ class Journal(ModelSQL, ModelView):
|
||||
return result
|
||||
|
||||
|
||||
class JournalSequence(ModelSQL, CompanyValueMixin):
|
||||
"Journal Sequence"
|
||||
__name__ = 'account.journal.sequence'
|
||||
journal = fields.Many2One(
|
||||
'account.journal', "Journal", ondelete='CASCADE', select=True)
|
||||
sequence = fields.Many2One(
|
||||
'ir.sequence', "Sequence",
|
||||
domain=[
|
||||
('code', '=', 'account.journal'),
|
||||
('company', 'in', [Eval('company', -1), None]),
|
||||
],
|
||||
depends=['company'])
|
||||
|
||||
@classmethod
|
||||
def __register__(cls, module_name):
|
||||
TableHandler = backend.get('TableHandler')
|
||||
exist = TableHandler.table_exist(cls._table)
|
||||
|
||||
super(JournalSequence, cls).__register__(module_name)
|
||||
|
||||
if not exist:
|
||||
cls._migrate_property([], [], [])
|
||||
|
||||
@classmethod
|
||||
def _migrate_property(cls, field_names, value_names, fields):
|
||||
field_names.append('sequence')
|
||||
value_names.append('sequence')
|
||||
fields.append('company')
|
||||
migrate_property(
|
||||
'account.journal', field_names, cls, value_names,
|
||||
parent='journal', fields=fields)
|
||||
|
||||
|
||||
class JournalAccount(ModelSQL, CompanyValueMixin):
|
||||
"Journal Account"
|
||||
__name__ = 'account.journal.account'
|
||||
journal = fields.Many2One(
|
||||
'account.journal', "Journal", ondelete='CASCADE', select=True)
|
||||
credit_account = fields.Many2One(
|
||||
'account.account', "Default Credit Account",
|
||||
domain=[
|
||||
('kind', '!=', 'view'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
],
|
||||
depends=['company'])
|
||||
debit_account = fields.Many2One(
|
||||
'account.account', "Default Debit Account",
|
||||
domain=[
|
||||
('kind', '!=', 'view'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
],
|
||||
depends=['company'])
|
||||
|
||||
@classmethod
|
||||
def __register__(cls, module_name):
|
||||
TableHandler = backend.get('TableHandler')
|
||||
exist = TableHandler.table_exist(cls._table)
|
||||
|
||||
super(JournalAccount, cls).__register__(module_name)
|
||||
|
||||
if not exist:
|
||||
cls._migrate_property([], [], [])
|
||||
|
||||
@classmethod
|
||||
def _migrate_property(cls, field_names, value_names, fields):
|
||||
field_names.extend(['credit_account', 'debit_account'])
|
||||
value_names.extend(['credit_account', 'debit_account'])
|
||||
fields.append('company')
|
||||
migrate_property(
|
||||
'account.journal', field_names, cls, value_names,
|
||||
parent='journal', fields=fields)
|
||||
|
||||
|
||||
class JournalCashContext(ModelView):
|
||||
'Journal Cash Context'
|
||||
__name__ = 'account.journal.open_cash.context'
|
||||
|
||||
@@ -6,20 +6,29 @@ from sql import Literal, Null, Cast
|
||||
from sql.aggregate import Sum
|
||||
from sql.conditionals import Coalesce
|
||||
|
||||
from trytond.model import fields
|
||||
from trytond import backend
|
||||
from trytond.model import ModelSQL, fields
|
||||
from trytond.pyson import Eval, Bool
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.tools import reduce_ids, grouped_slice
|
||||
from trytond.tools.multivalue import migrate_property
|
||||
from trytond.modules.company.model import (
|
||||
CompanyMultiValueMixin, CompanyValueMixin)
|
||||
|
||||
__all__ = ['Party', 'PartyReplace']
|
||||
__all__ = ['Party', 'PartyAccount', 'PartyReplace']
|
||||
account_names = [
|
||||
'account_payable', 'account_receivable',
|
||||
'customer_tax_rule', 'supplier_tax_rule']
|
||||
|
||||
|
||||
class Party:
|
||||
class Party(CompanyMultiValueMixin):
|
||||
__metaclass__ = PoolMeta
|
||||
__name__ = 'party.party'
|
||||
account_payable = fields.Property(fields.Many2One('account.account',
|
||||
'Account Payable', domain=[
|
||||
accounts = fields.One2Many('party.party.account', 'party', "Accounts")
|
||||
account_payable = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Account Payable",
|
||||
domain=[
|
||||
('kind', '=', 'payable'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
],
|
||||
@@ -27,8 +36,9 @@ class Party:
|
||||
'required': Bool(Eval('context', {}).get('company')),
|
||||
'invisible': ~Eval('context', {}).get('company'),
|
||||
}))
|
||||
account_receivable = fields.Property(fields.Many2One('account.account',
|
||||
'Account Receivable', domain=[
|
||||
account_receivable = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Account Receivable",
|
||||
domain=[
|
||||
('kind', '=', 'receivable'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
],
|
||||
@@ -36,8 +46,8 @@ class Party:
|
||||
'required': Bool(Eval('context', {}).get('company')),
|
||||
'invisible': ~Eval('context', {}).get('company'),
|
||||
}))
|
||||
customer_tax_rule = fields.Property(fields.Many2One('account.tax.rule',
|
||||
'Customer Tax Rule',
|
||||
customer_tax_rule = fields.MultiValue(fields.Many2One(
|
||||
'account.tax.rule', "Customer Tax Rule",
|
||||
domain=[
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
('kind', 'in', ['sale', 'both']),
|
||||
@@ -45,8 +55,8 @@ class Party:
|
||||
states={
|
||||
'invisible': ~Eval('context', {}).get('company'),
|
||||
}, help='Apply this rule on taxes when party is customer.'))
|
||||
supplier_tax_rule = fields.Property(fields.Many2One('account.tax.rule',
|
||||
'Supplier Tax Rule',
|
||||
supplier_tax_rule = fields.MultiValue(fields.Many2One(
|
||||
'account.tax.rule', "Supplier Tax Rule",
|
||||
domain=[
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
('kind', 'in', ['purchase', 'both']),
|
||||
@@ -73,6 +83,31 @@ class Party:
|
||||
depends=['currency_digits']),
|
||||
'get_receivable_payable', searcher='search_receivable_payable')
|
||||
|
||||
@classmethod
|
||||
def multivalue_model(cls, field):
|
||||
pool = Pool()
|
||||
if field in account_names:
|
||||
return pool.get('party.party.account')
|
||||
return super(Party, cls).multivalue_model(field)
|
||||
|
||||
@classmethod
|
||||
def default_account_payable(cls, **pattern):
|
||||
pool = Pool()
|
||||
Configuration = pool.get('account.configuration')
|
||||
config = Configuration(1)
|
||||
account = config.get_multivalue(
|
||||
'default_account_payable', **pattern)
|
||||
return account.id if account else None
|
||||
|
||||
@classmethod
|
||||
def default_account_receivable(cls, **pattern):
|
||||
pool = Pool()
|
||||
Configuration = pool.get('account.configuration')
|
||||
config = Configuration(1)
|
||||
account = config.get_multivalue(
|
||||
'default_account_receivable', **pattern)
|
||||
return account.id if account else None
|
||||
|
||||
@classmethod
|
||||
def get_currency_digits(cls, parties, name):
|
||||
pool = Pool()
|
||||
@@ -197,6 +232,60 @@ class Party:
|
||||
return [('id', 'in', query)]
|
||||
|
||||
|
||||
class PartyAccount(ModelSQL, CompanyValueMixin):
|
||||
"Party Account"
|
||||
__name__ = 'party.party.account'
|
||||
party = fields.Many2One(
|
||||
'party.party', "Party", ondelete='CASCADE', select=True)
|
||||
account_payable = fields.Many2One(
|
||||
'account.account', "Account Payable",
|
||||
domain=[
|
||||
('kind', '=', 'payable'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
],
|
||||
depends=['company'])
|
||||
account_receivable = fields.Many2One(
|
||||
'account.account', "Account Receivable",
|
||||
domain=[
|
||||
('kind', '=', 'receivable'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
],
|
||||
depends=['company'])
|
||||
customer_tax_rule = fields.Many2One(
|
||||
'account.tax.rule', "Customer Tax Rule",
|
||||
domain=[
|
||||
('company', '=', Eval('company', -1)),
|
||||
('kind', 'in', ['sale', 'both']),
|
||||
],
|
||||
depends=['company'])
|
||||
supplier_tax_rule = fields.Many2One(
|
||||
'account.tax.rule', "Supplier Tax Rule",
|
||||
domain=[
|
||||
('company', '=', Eval('company', -1)),
|
||||
('kind', 'in', ['purchase', 'both']),
|
||||
],
|
||||
depends=['company'])
|
||||
|
||||
@classmethod
|
||||
def __register__(cls, module_name):
|
||||
TableHandler = backend.get('TableHandler')
|
||||
exist = TableHandler.table_exist(cls._table)
|
||||
|
||||
super(PartyAccount, cls).__register__(module_name)
|
||||
|
||||
if not exist:
|
||||
cls._migrate_property([], [], [])
|
||||
|
||||
@classmethod
|
||||
def _migrate_property(cls, field_names, value_names, fields):
|
||||
field_names.extend(account_names)
|
||||
value_names.extend(account_names)
|
||||
fields.append('company')
|
||||
migrate_property(
|
||||
'party.party', field_names, cls, value_names,
|
||||
parent='party', fields=fields)
|
||||
|
||||
|
||||
class PartyReplace:
|
||||
__metaclass__ = PoolMeta
|
||||
__name__ = 'party.replace'
|
||||
|
||||
@@ -1080,6 +1080,7 @@ class TaxableMixin(object):
|
||||
Configuration = pool.get('account.configuration')
|
||||
|
||||
config = Configuration(1)
|
||||
tax_rounding = config.tax_rounding
|
||||
taxes = {}
|
||||
with Transaction().set_context(self._get_tax_context()):
|
||||
taxable_lines = [_TaxableLine(*params)
|
||||
@@ -1096,9 +1097,9 @@ class TaxableMixin(object):
|
||||
else:
|
||||
taxes[taxline]['base'] += taxline['base']
|
||||
taxes[taxline]['amount'] += taxline['amount']
|
||||
if config.tax_rounding == 'line':
|
||||
if tax_rounding == 'line':
|
||||
self._round_taxes(taxes)
|
||||
if config.tax_rounding == 'document':
|
||||
if tax_rounding == 'document':
|
||||
self._round_taxes(taxes)
|
||||
return taxes
|
||||
|
||||
|
||||
@@ -10,5 +10,4 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<separator id="invoice" string="Invoice" colspan="4"/>
|
||||
<label name="tax_rounding"/>
|
||||
<field name="tax_rounding"/>
|
||||
<field name="tax_roundings" colspan="2" yexpand="0"/>
|
||||
</form>
|
||||
Reference in new issue
Block a user