2022-08-05 10:02:04 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# This file is part of the cashbook-module from m-ds for Tryton.
|
|
|
|
# The COPYRIGHT file at the top level of this repository contains the
|
|
|
|
# full copyright notices and license terms.
|
|
|
|
|
2022-08-08 12:31:42 +00:00
|
|
|
from trytond.model import Workflow, ModelView, ModelSQL, fields, Check
|
|
|
|
from trytond.pyson import Eval
|
|
|
|
from trytond.exceptions import UserError
|
|
|
|
from trytond.i18n import gettext
|
2022-08-08 15:31:16 +00:00
|
|
|
from trytond.transaction import Transaction
|
2022-08-05 10:02:04 +00:00
|
|
|
|
|
|
|
|
2022-08-08 12:31:42 +00:00
|
|
|
STATES = {
|
|
|
|
'readonly': Eval('state', '') != 'open',
|
|
|
|
}
|
|
|
|
DEPENDS=['state']
|
|
|
|
|
|
|
|
sel_state_book = [
|
|
|
|
('open', 'Open'),
|
|
|
|
('closed', 'Closed'),
|
|
|
|
('archive', 'Archive'),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
class Book(Workflow, ModelSQL, ModelView):
|
|
|
|
'Cashbook'
|
2022-08-05 10:02:04 +00:00
|
|
|
__name__ = 'cashbook.book'
|
|
|
|
|
2022-08-08 12:31:42 +00:00
|
|
|
name = fields.Char(string='Name', required=True,
|
|
|
|
states=STATES, depends=DEPENDS)
|
|
|
|
btype = fields.Many2One(string='Type', required=True,
|
|
|
|
model_name='cashbook.type', ondelete='RESTRICT',
|
|
|
|
states=STATES, depends=DEPENDS)
|
2022-08-08 15:31:16 +00:00
|
|
|
owner = fields.Many2One(string='Owner', required=True, select=True,
|
|
|
|
model_name='res.user', ondelete='SET NULL')
|
|
|
|
reviewer = fields.Many2One(string='Reviewer', select=True,
|
|
|
|
help='Group of users who have write access to the cashbook.',
|
|
|
|
model_name='res.group', ondelete='SET NULL')
|
|
|
|
observer = fields.Many2One(string='Observer', select=True,
|
|
|
|
help='Group of users who have read-only access to the cashbook.',
|
|
|
|
model_name='res.group', ondelete='SET NULL')
|
2022-08-08 12:31:42 +00:00
|
|
|
lines = fields.One2Many(string='Lines', field='cashbook',
|
|
|
|
model_name='cashbook.line',
|
|
|
|
states=STATES, depends=DEPENDS)
|
|
|
|
state = fields.Selection(string='State', required=True,
|
|
|
|
readonly=True, selection=sel_state_book)
|
|
|
|
state_string = state.translated('state')
|
2022-08-05 10:02:04 +00:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def __setup__(cls):
|
|
|
|
super(Book, cls).__setup__()
|
|
|
|
cls._order.insert(0, ('name', 'ASC'))
|
2022-08-08 12:31:42 +00:00
|
|
|
t = cls.__table__()
|
|
|
|
cls._sql_constraints.extend([
|
|
|
|
('state_val',
|
|
|
|
Check(t, t.state.in_(['open', 'closed', 'archive'])),
|
|
|
|
'cashbook.msg_book_wrong_state_value'),
|
|
|
|
])
|
|
|
|
cls._transitions |= set((
|
|
|
|
('open', 'closed'),
|
|
|
|
('closed', 'open'),
|
|
|
|
('closed', 'archive'),
|
|
|
|
))
|
|
|
|
cls._buttons.update({
|
|
|
|
'wfopen': {
|
|
|
|
'invisible': Eval('state', '') != 'closed',
|
|
|
|
'depends': ['state'],
|
|
|
|
},
|
|
|
|
'wfclosed': {
|
|
|
|
'invisible': Eval('state') != 'open',
|
|
|
|
'depends': ['state'],
|
|
|
|
},
|
|
|
|
'wfarchive': {
|
|
|
|
'invisible': Eval('state') != 'closed',
|
|
|
|
'depends': ['state'],
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def default_state(cls):
|
|
|
|
return 'open'
|
|
|
|
|
2022-08-08 15:31:16 +00:00
|
|
|
@classmethod
|
|
|
|
def default_owner(cls):
|
|
|
|
""" default: current user
|
|
|
|
"""
|
|
|
|
return Transaction().user
|
|
|
|
|
2022-08-08 12:31:42 +00:00
|
|
|
@classmethod
|
|
|
|
@ModelView.button
|
|
|
|
@Workflow.transition('open')
|
|
|
|
def wfopen(cls, books):
|
|
|
|
""" open cashbook
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
@ModelView.button
|
|
|
|
@Workflow.transition('closed')
|
|
|
|
def wfclosed(cls, books):
|
|
|
|
""" cashbook is closed
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
@ModelView.button
|
|
|
|
@Workflow.transition('archive')
|
|
|
|
def wfarchive(cls, books):
|
|
|
|
""" cashbook is archived
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def write(cls, *args):
|
|
|
|
""" deny update if book is not 'open'
|
|
|
|
"""
|
|
|
|
actions = iter(args)
|
|
|
|
for books, values in zip(actions, actions):
|
|
|
|
for book in books:
|
|
|
|
if book.state != 'open':
|
|
|
|
# allow state-update, if its the only action
|
|
|
|
if not (('state' in values.keys()) and (len(values.keys()) == 1)):
|
|
|
|
raise UserError(gettext(
|
|
|
|
'cashbook.msg_book_deny_write',
|
|
|
|
bookname = book.rec_name,
|
|
|
|
state_txt = book.state_string,
|
|
|
|
))
|
|
|
|
super(Book, cls).write(*args)
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def delete(cls, books):
|
|
|
|
""" deny delete if book has lines
|
|
|
|
"""
|
|
|
|
for book in books:
|
|
|
|
if (len(book.lines) > 0) and (book.state != 'archive'):
|
|
|
|
raise UserError(gettext(
|
|
|
|
'cashbook.msg_book_deny_delete',
|
|
|
|
bookname = book.rec_name,
|
|
|
|
booklines = len(book.lines),
|
|
|
|
))
|
|
|
|
return super(Book, cls).delete(books)
|
2022-08-05 10:02:04 +00:00
|
|
|
|
|
|
|
# end Book
|