Files
tryton/journal.py
T

171 lines
5.8 KiB
Python

"Journal"
from trytond.osv import fields, OSV
STATES = {
'readonly': "state == 'close'",
}
_ICONS = {
'open': 'STOCK_OPEN',
'close': 'STOCK_CLOSE',
}
class Type(OSV):
'Journal Type'
_name = 'account.journal.type'
_order = 'code'
_description = __doc__
name = fields.Char('Name', size=None, required=True, translate=True)
code = fields.Char('Code', size=None, required=True)
def __init__(self):
super(Type, self).__init__()
self._sql_constraints += [
('code_uniq', 'UNIQUE(code)', 'Code must be unique!'),
]
Type()
class View(OSV):
'Journal View'
_name = 'account.journal.view'
_description = __doc__
_order = 'name, id'
name = fields.Char('Name', size=None, required=True)
columns = fields.One2Many('account.journal.view.column', 'view', 'Columns')
View()
class Column(OSV):
'Journal View Column'
_name = 'account.journal.view.column'
_description = __doc__
_order = 'sequence, id'
name = fields.Char('Name', size=None, required=True)
field = fields.Many2One('ir.model.field', 'Field', required=True,
domain="[('model.model', '=', 'account.move.line')]")
view = fields.Many2One('account.journal.view', 'View', select=1)
sequence = fields.Integer('Sequence', select=2)
required = fields.Boolean('Required')
readonly = fields.Boolean('Readonly')
def default_sequence(self, cursor, user, context=None):
cursor.execute('SELECT MAX(sequence) ' \
'FROM ' + self._table)
res = cursor.fetchone()
if res:
return res[0]
return 0
Column()
class Journal(OSV):
'Journal'
_name = 'account.journal'
_description = __doc__
_order = 'name, id'
name = fields.Char('Name', size=None, required=True, translate=True)
code = fields.Char('Code', size=None)
active = fields.Boolean('Active', select=2)
type = fields.Selection('get_types', 'Type', required=True)
view = fields.Many2One('account.journal.view', 'View')
centralised = fields.Boolean('Centralised counterpart')
update_posted = fields.Boolean('Allow cancelling moves')
sequence = fields.Many2One('ir.sequence', 'Sequence', required=True,
domain="[('code', '=', 'account.journal')]")
credit_account = fields.Many2One('account.account', 'Default credit account')
debit_account = fields.Many2One('account.account', 'Default debit account')
def default_active(self, cursor, user, context=None):
return True
def default_centralisation(self, cursor, user, context=None):
return False
def get_types(self, cursor, user, context=None):
type_obj = self.pool.get('account.journal.type')
type_ids = type_obj.search(cursor, user, [], context=context)
types = type_obj.browse(cursor, user, type_ids, context=context)
return [(x.code, x.name) for x in types]
def name_search(self, cursor, user, name='', args=None, operator='ilike',
context=None, limit=None):
if name:
ids = self.search(cursor, user,
[('code', 'like', name + '%')] + args,
limit=limit, context=context)
if not ids:
ids = self.search(cursor, user,
[(self._rec_name, operator, name)] + args,
limit=limit, context=context)
else:
ids = self.search(cursor, user, args, limit=limit, context=context)
res = self.name_get(cursor, user, ids, context=context)
return res
Journal()
class Period(OSV):
'Journal - Period'
_name = 'account.journal.period'
_description = __doc__
_order = 'name, id'
name = fields.Char('Name', size=None, required=True)
journal = fields.Many2One('account.journal', 'Journal', required=True,
ondelete='CASCADE', states=STATES)
period = fields.Many2One('account.period', 'Period', required=True,
ondelete='CASCADE', states=STATES)
icon = fields.Function('get_icon', string='Icon', type='char')
active = fields.Boolean('Active', select=2, states=STATES)
state = fields.Selection([
('open', 'Open'),
('close', 'Close'),
], 'State', readonly=True, required=True)
def __init__(self):
super(Period, self).__init__()
self._sql_constraints += [
('journal_period_uniq', 'UNIQUE(journal, period)',
'You can only open one journal per period!'),
]
def default_active(self, cursor, user, context=None):
return True
def default_state(self, cursor, user, context=None):
return 'open'
def get_icon(self, cursor, user, ids, name, arg, context=None):
res = {}
for period in self.browse(cursor, user, ids, context=context):
res[period.id] = _ICONS.get(period.state, '')
return res
def _check(self, cursor, user, ids, context=None):
move_obj = self.pool.get('account.move')
for period in self.browse(cursor, user, ids, context=context):
move_ids = move_line_obj.search(cursor, user, [
('journal', '=', period.journal.id),
('period', '=', period.period.id),
], limit=1, context=context)
if move_ids:
raise ExceptORM('Error', 'You can not modify/delete ' \
'a journal - period with moves!')
return
def write(self, cursor, user, ids, vals, context=None):
self._check(cursor, user, ids, context=context)
return super(Period, self).write(cursor, user, ids, vals, context=context)
def unlink(self, cursor, user, ids, context=None):
self._check(cursor, user, ids, context=context)
return super(Period, self).unlink(cursor, user, ids, vals, context=context)
Period()