268 lines
9.1 KiB
Python
268 lines
9.1 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.
|
|
"Journal"
|
|
|
|
from trytond.osv import fields, OSV
|
|
from trytond.wizard import Wizard, WizardOSV
|
|
|
|
STATES = {
|
|
'readonly': "state == 'close'",
|
|
}
|
|
_ICONS = {
|
|
'open': 'tryton-open',
|
|
'close': 'tryton-readonly',
|
|
}
|
|
|
|
|
|
class Type(OSV):
|
|
'Journal Type'
|
|
_name = 'account.journal.type'
|
|
_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!'),
|
|
]
|
|
self._order.insert(0, ('code', 'ASC'))
|
|
|
|
Type()
|
|
|
|
|
|
class View(OSV):
|
|
'Journal View'
|
|
_name = 'account.journal.view'
|
|
_description = __doc__
|
|
name = fields.Char('Name', size=None, required=True)
|
|
columns = fields.One2Many('account.journal.view.column', 'view', 'Columns')
|
|
|
|
def __init__(self):
|
|
super(View, self).__init__()
|
|
self._order.insert(0, ('name', 'ASC'))
|
|
|
|
View()
|
|
|
|
|
|
class Column(OSV):
|
|
'Journal View Column'
|
|
_name = 'account.journal.view.column'
|
|
_description = __doc__
|
|
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 __init__(self):
|
|
super(Column, self).__init__()
|
|
self._order.insert(0, ('sequence', 'ASC'))
|
|
|
|
def default_required(self, cursor, user, context=None):
|
|
return False
|
|
|
|
def default_readonly(self, cursor, user, context=None):
|
|
return False
|
|
|
|
Column()
|
|
|
|
|
|
class Journal(OSV):
|
|
'Journal'
|
|
_name = 'account.journal'
|
|
_description = __doc__
|
|
|
|
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.Property(type='many2one',
|
|
relation='account.account', string='Default Credit Account',
|
|
domain="[('kind', '!=', 'view'), ('company', '=', company)]",
|
|
states={
|
|
'required': "centralised or type == 'cash'",
|
|
})
|
|
debit_account = fields.Property(type='many2one',
|
|
relation='account.account', string='Default Debit Account',
|
|
domain="[('kind', '!=', 'view'), ('company', '=', company)]",
|
|
states={
|
|
'required': "centralised or type == 'cash'",
|
|
})
|
|
|
|
def __init__(self):
|
|
super(Journal, self).__init__()
|
|
self._order.insert(0, ('name', 'ASC'))
|
|
|
|
def default_active(self, cursor, user, context=None):
|
|
return True
|
|
|
|
def default_centralised(self, cursor, user, context=None):
|
|
return False
|
|
|
|
def default_update_posted(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__
|
|
|
|
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!'),
|
|
]
|
|
self._order.insert(0, ('name', 'ASC'))
|
|
self._error_messages.update({
|
|
'modify_del_journal_period': 'You can not modify/delete ' \
|
|
'a journal - period with moves!',
|
|
'create_journal_period': 'You can not create ' \
|
|
'a journal - period on a closed period!',
|
|
'open_journal_period': 'You can not open ' \
|
|
'a journal - period from a closed 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_obj.search(cursor, user, [
|
|
('journal', '=', period.journal.id),
|
|
('period', '=', period.period.id),
|
|
], limit=1, context=context)
|
|
if move_ids:
|
|
self.raise_user_error(cursor, 'modify_del_journal_period',
|
|
context=context)
|
|
return
|
|
|
|
def create(self, cursor, user, vals, context=None):
|
|
period_obj = self.pool.get('account.period')
|
|
if vals.get('period'):
|
|
period = period_obj.browse(cursor, user, vals['period'],
|
|
context=context)
|
|
if period.state == 'close':
|
|
self.raise_user_error(cursor, 'create_journal_period',
|
|
context=context)
|
|
return super(Period, self).create(cursor, user, vals, context=context)
|
|
|
|
def write(self, cursor, user, ids, vals, context=None):
|
|
if vals != {'state': 'close'} \
|
|
and vals != {'state': 'open'}:
|
|
self._check(cursor, user, ids, context=context)
|
|
if vals.get('state') == 'open':
|
|
for journal_period in self.browse(cursor, user, ids,
|
|
context=context):
|
|
if journal_period.period.state == 'close':
|
|
self.raise_user_error(cursor, 'open_journal_period',
|
|
context=context)
|
|
return super(Period, self).write(cursor, user, ids, vals,
|
|
context=context)
|
|
|
|
def delete(self, cursor, user, ids, context=None):
|
|
self._check(cursor, user, ids, context=context)
|
|
return super(Period, self).delete(cursor, user, ids, vals,
|
|
context=context)
|
|
|
|
Period()
|
|
|
|
|
|
class ClosePeriod(Wizard):
|
|
'Close Journal - Period'
|
|
_name = 'account.journal.close_period'
|
|
states = {
|
|
'init': {
|
|
'actions': ['_close'],
|
|
'result': {
|
|
'type': 'state',
|
|
'state': 'end',
|
|
},
|
|
},
|
|
}
|
|
|
|
def _close(self, cursor, user, data, context=None):
|
|
journal_period_obj = self.pool.get('account.journal.period')
|
|
journal_period_obj.write(cursor, user, data['ids'], {
|
|
'state': 'close',
|
|
}, context=context)
|
|
return {}
|
|
|
|
ClosePeriod()
|
|
|
|
|
|
class ReOpenPeriod(Wizard):
|
|
'Re-Open Journal - Period'
|
|
_name = 'account.journal.reopen_period'
|
|
states = {
|
|
'init': {
|
|
'actions': ['_reopen'],
|
|
'result': {
|
|
'type': 'state',
|
|
'state': 'end',
|
|
},
|
|
},
|
|
}
|
|
|
|
def _reopen(self, cursor, user, data, context=None):
|
|
journal_period_obj = self.pool.get('account.journal.period')
|
|
journal_period_obj.write(cursor, user, data['ids'], {
|
|
'state': 'open',
|
|
}, context=context)
|
|
return {}
|
|
|
|
ReOpenPeriod()
|