Files
tryton/party.py
T
2014-12-02 12:54:33 +01:00

109 lines
3.9 KiB
Python

# 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 fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
from trytond.pyson import Eval
__all__ = ['Party']
__metaclass__ = PoolMeta
class Party:
__name__ = 'party.party'
credit_amount = fields.Function(fields.Numeric('Credit Amount',
digits=(16, Eval('credit_limit_digits', 2)),
depends=['credit_limit_digits']),
'get_credit_amount')
credit_limit_amount = fields.Property(fields.Numeric(
'Credit Limit Amount',
digits=(16, Eval('credit_limit_digits', 2)),
depends=['credit_limit_digits']))
credit_limit_digits = fields.Function(fields.Integer('Currency Digits'),
'get_credit_limit_digits')
@classmethod
def __setup__(cls):
super(Party, cls).__setup__()
cls._error_messages.update({
'credit_limit_amount': (
'"%s" has reached the credit limit amount (%s)'),
'credit_limit_dunning': (
'"%s" has reached the dunning credit limit (%s)'),
})
@classmethod
def get_credit_amount(cls, parties, name):
return {p.id: p.receivable for p in parties}
@staticmethod
def _credit_limit_to_lock():
'Return models to lock when checking credit limit'
return ['account.move.line']
def check_credit_limit(self, amount, origin=None):
'''
Check if amount will not reach credit limit for party
If origin is set and user is in group credit_limit then a warning will
be raised
'''
pool = Pool()
ModelData = pool.get('ir.model.data')
try:
Dunning = pool.get('account.dunning')
except KeyError:
Dunning = None
User = pool.get('res.user')
Group = pool.get('res.group')
if self.credit_limit_amount is None:
return
def in_group():
group = Group(ModelData.get_id('account_credit_limit',
'group_credit_limit'))
transaction = Transaction()
user_id = transaction.user
if user_id == 0:
user_id = transaction.context.get('user', user_id)
if user_id == 0:
return True
user = User(user_id)
return origin and group in user.groups
for model in self._credit_limit_to_lock():
Model = pool.get(model)
Transaction().cursor.lock(Model._table)
if self.credit_limit_amount < self.credit_amount + amount:
if not in_group():
self.raise_user_error('credit_limit_amount',
(self.rec_name, self.credit_limit_amount))
warning_name = 'credit_limit_amount_%s' % origin
self.raise_user_warning(warning_name, 'credit_limit_amount',
(self.rec_name, self.credit_limit_amount))
if Dunning:
dunnings = Dunning.search([
('party', '=', self.id),
('level.credit_limit', '=', True),
('blocked', '!=', True),
])
if dunnings:
dunning = dunnings[0]
if not in_group():
self.raise_user_error('credit_limit_dunning',
(self.rec_name, dunning.rec_name))
warning_name = 'credit_limit_dunning_%s' % origin
self.raise_user_warning(warning_name, 'credit_limit_dunning',
(self.rec_name, dunning.rec_name))
def get_credit_limit_digits(self, name):
pool = Pool()
Company = pool.get('company.company')
company_id = Transaction().context.get('company')
if not company_id:
return 2
company = Company(company_id)
return company.currency.digits