cashbook/book.py
Frederik Jaeckel d57d76ba3b book, line, category, types: berechtigung für company-user + test,
book: währung neu,
line: buchungstyp, betrag, credit, debit, währung, sortierung
2022-08-10 16:30:08 +02:00

173 lines
5.5 KiB
Python

# -*- 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.
from trytond.model import Workflow, ModelView, ModelSQL, fields, Check
from trytond.pyson import Eval, Or, Bool
from trytond.exceptions import UserError
from trytond.i18n import gettext
from trytond.transaction import Transaction
from trytond.pool import Pool
STATES = {
'readonly': Eval('state', '') != 'open',
}
DEPENDS=['state']
sel_state_book = [
('open', 'Open'),
('closed', 'Closed'),
('archive', 'Archive'),
]
class Book(Workflow, ModelSQL, ModelView):
'Cashbook'
__name__ = 'cashbook.book'
company = fields.Many2One(string='Company', model_name='company.company',
required=True, ondelete="RESTRICT")
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)
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')
lines = fields.One2Many(string='Lines', field='cashbook',
model_name='cashbook.line',
states=STATES, depends=DEPENDS)
account = fields.Many2One(string='Account', select=True,
model_name='account.account', ondelete='RESTRICT',
states=STATES, depends=DEPENDS)
currency = fields.Many2One(string='Currency', required=True,
model_name='currency.currency',
states={
'readonly': Or(
STATES['readonly'],
Bool(Eval('lines', [])),
),
}, depends=DEPENDS+['lines'])
state = fields.Selection(string='State', required=True,
readonly=True, selection=sel_state_book)
state_string = state.translated('state')
@classmethod
def __setup__(cls):
super(Book, cls).__setup__()
cls._order.insert(0, ('name', 'ASC'))
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_currency(cls):
""" currency of company
"""
Company = Pool().get('company.company')
company = cls.default_company()
if company:
company = Company(company)
if company.currency:
return company.currency.id
@staticmethod
def default_company():
return Transaction().context.get('company') or None
@classmethod
def default_state(cls):
return 'open'
@classmethod
def default_owner(cls):
""" default: current user
"""
return Transaction().user
@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)
# end Book